Django 模型 - post 时基于主键的列保存

Django Models - Column save based on primary key when post

这是我的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)

@receiver(post_save, sender=AppointmentMaster)
def generate_AppointmentMaster_unique_key(sender, instance, created, **kwargs):

   post_save.disconnect(generate_AppointmentMaster_unique_key, sender=MenstrualHistory)
   instance.menstrual_history_n_key = "USER-{}".format(instance.id)
   instance.save()
   post_save.connect(generate_AppointmentMaster_unique_key, sender=AppointmentMaster)

并且我正在使用 viewsets.ModelViewSet 用于 post details.I 希望在创建新行时自动保存 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

您可以覆盖 Model 中的 .save() 方法,当您 updatecreate 一个对象时,它会自动执行此操作。

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)