繁体   English   中英

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

[英]Django - get auto_now field in pre_save signal

我正在使用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_atupdated_by 在该信号中, updated_by值已经是新值,应该在请求的末尾,但是updated_at不是。 这是旧的(当前)值。 我希望,如果可能的话,能够在保存后得到应该在updated_at字段中的updated_at

我使用的原因pre_save信号,而不是post_save是因为我更新里面的实例。

由于您使用的是auto_nowupdated_at领域,它将继承editable=Falseblank=True

文档所述

按照当前的实现,将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字段应该是可编辑的,并且您的信号应该可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM