Search code examples
djangodjango-modelsdjango-signals

Django Models - Column save based on primary key when post


This is my 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)

and i'm using viewsets.ModelViewSet for post details.I want to save user_key automatically when create a new row from post api.

I want output like

{  
   "id":1,
   "user_key":"USER-1",
   "phone_number":"90000000",
   "email":"abc@gmail.com"
}

Solution

  • You can override the .save() method in Model that will automatically perform this action when ever you update or create an object.

    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)