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)

Вернуться на верх