Django-在pre_save信号中获取auto_now字段

时间:2019-07-03 14:47:10

标签: python django signals

我正在使用Django 2.1.5。

有一个带有“ auto_now”字段的模型:

class BaseModel(models.Model):
    id = models.UUIDField(default=uuid.uuid4, editable=False, db_index=True, unique=True, primary_key=True)
    updated_at = models.DateTimeField(db_index=True, auto_now=True)
    updated_by = models.CharField(max_length=200)
    responded_at = models.DateTimeField(db_index=True, null=True, blank=True)
    responded_by = models.CharField(max_length=200, null=True, blank=True)

现在,我对该模型有一个pre_save信号,我想在那里将responded_atresponded_by字段更新为等于updated_at和{{1 }}。在该信号中-updated_by的值已经是新值,如在请求末尾那样,但是updated_by不是。这是旧的(当前)值。 我希望,如果可能的话,能够在保存后获得updated_at字段中的值。

我使用updated_at信号而不使用pre_save的原因是因为我正在更新其中的实例。

1 个答案:

答案 0 :(得分:0)

由于您在auto_now字段中使用updated_at,因此它将继承editable=Falseblank=True

作为docs状态:

  

按照当前的实现,将auto_now或auto_now_add设置为True会导致该字段设置为editable = False和blank = True设置。

为避免这种情况,您可以编写一个自定义字段,如下所示:

from django.utils import timezone


class AutoDateTimeField(models.DateTimeField):
    def pre_save(self, model_instance, add):
        return timezone.now()

您可以像这样在BaseModel中使用它:

class BaseModel(models.Model):
    updated_at = models.AutoDateTimeField(default=timezone.now)
    # ...

通过这种方式,updated_at字段应该是可编辑的,并且您的信号也应该正常工作。