djangomodel

Save the field in the model based on another field in the same model


I am trying to save my field of the model based on another field in this same model.

For example:

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField()

    def baby_boomer_status(self):
        import datetime
        if self.birth_date < datetime.date(1945, 8, 1):
            return "Pre-boomer"
        elif self.birth_date < datetime.date(1965, 1, 1):
            return "Baby boomer"
        else:
            return "Post-boomer"
    my_try = models.CharField(max_length=50, default=baby_boomer_status) #it does not work

How I can properity save my_try always when I change birth_date in my object. To have value in my field my_try "Pre-boomer" or "Baby boomer".


Solution

  • Override the save() method

    class Person(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        birth_date = models.DateField()
        my_try = models.CharField(max_length=50, null=True, blank=True)
    
        def save(self, *args, **kwargs):
            created = not self.pk
            super().save(*args, **kwargs)
            if created:
                self.my_try = self.baby_boomer_status()
                self.save()
    
        def baby_boomer_status(self):
            import datetime
            if self.birth_date < datetime.date(1945, 8, 1):
                return "Pre-boomer"
            elif self.birth_date < datetime.date(1965, 1, 1):
                return "Baby boomer"
            else:
                return "Post-boomer"

    Change the save method to,

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        Person.objects.filter(pk=self.pk).update(my_try=self.baby_boomer_status())