Django, Как обновить атрибут DateTimeField только при изменении одного конкретного атрибута

#python #django #save

Вопрос:

Я хотел бы обновить атрибут date_assigned только тогда, когда атрибут Customer будет изменен. Я знаю, что мне нужно перезаписать функцию сохранения в той же модели, но я не знаю точно, как это сделать.

 class Ip(models.Model):
    customer = models.ForeignKey(Customer, null=False, on_delete=models.CASCADE)
    ip = models.GenericIPAddressField(protocol="IPv4", null=False, unique=True)
    date_created = models.DateTimeField(auto_now_add=True,)
    date_updated = models.DateTimeField(auto_now=True,)
    date_assigned = models.DateTimeField(auto_now=True)
 

Есть какие-нибудь идеи? заранее спасибо.

Ответ №1:

Пожалуйста, прочтите документы о переопределении метода сохранения.

Один очень полезный инструмент для этого находится в пакете model_utils.

 from model_utils import FieldTracker

class Ip(models.Model):
    customer = models.ForeignKey(Customer, null=False, on_delete=models.CASCADE)
    ip = models.GenericIPAddressField(protocol="IPv4", null=False, unique=True)
    date_created = models.DateTimeField(auto_now_add=True,)
    date_updated = models.DateTimeField(auto_now=True,)
    date_assigned = models.DateTimeField()

    customer_tracker = FieldTracker(fields=['customer'])

    def save(self, *args, **kwargs):
        if self.customer_tracker.changed():
            self.date_assigned = timezone.now()
        super().save(*args, **kwargs)
 

Комментарии:

1. Именно это я и искал, а затем удалил бы auto_now=True из поля даты и времени.

2. Ах да, забыл снять флаг auto_now.