Django Models - Сохранение столбцов на основе первичного ключа при отправке сообщения
Это мой model.py
class AppointmentMaster(models.Model):
id = models.AutoField(primary_key=True)
user_key = models.CharField(max_length=30,blank=True,unique=True)
phone_number = models.CharField(max_length=20, blank=True, null=True)
email = models.CharField(max_length=20, blank=True, null=True)
и я использую viewsets.ModelViewSet для деталей поста. Я хочу автоматически сохранять user_key при создании новой строки из post api.
Я хочу получить результат типа
{
"id":1,
"user_key":"USER-1",
"phone_number":"90000000",
"email":"abc@gmail.com"
}
Я не часто использую наборы представлений. Если вы сможете обойтись без них в своем приложении, это может сработать. Я бы также рекомендовал использовать pk, который уже поставляется с каждым экземпляром модели, вместо вашего поля 'id', которое, как я предполагаю, служит аналогичной цели.
yourapp.views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view(['POST'])
def yourView(request):
if request.method == "POST":
data = request.POST
appt = AppointmentMaster()
appt.user_key = data.get('user_key')
appt.phone_number = data.get("phone_number")
appt.email = data.get("email")
appt.save()
return Response('id':appt.id, 'user_key':appt.user_key, 'phone_number':appt.phone_number, 'email':appt.email)
Возможно, вам потребуется включить дополнительную проверку ошибок, чтобы убедиться, что экземпляр был правильно сохранен и, возможно, запросить его из базы данных, чтобы 'appt.id' правильно работал в ответе. Это повлечет за собой добавление:
...
appt.save()
newAppt = AppointmentMaster.objects.get(user_key=data.get('user_key'))
и затем замените все параметры ответа на 'newAppt' вместо 'appt'. Надеюсь, это помогло и я понял ваш вопрос :D
Вы можете переопределить метод .save()
в Model
, который будет автоматически выполнять это действие, когда вы update
или create
объект.
class AppointmentMaster(models.Model):
id = models.AutoField(primary_key=True)
user_key = models.CharField(max_length=30,blank=True,unique=True)
phone_number = models.CharField(max_length=20, blank=True, null=True)
email = models.CharField(max_length=20, blank=True, null=True)
def save(self, *args, **kwargs):
self.user_key = f"USER-{self.id}"
super(AppointmentMaster, self).save(*args, **kwargs)