我正在使用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_at
和responded_by
字段更新为等于updated_at
和{{1 }}。在该信号中-updated_by
的值已经是新值,如在请求末尾那样,但是updated_by
不是。这是旧的(当前)值。
我希望,如果可能的话,能够在保存后获得updated_at
字段中的值。
我使用updated_at
信号而不使用pre_save
的原因是因为我正在更新其中的实例。
答案 0 :(得分:0)
由于您在auto_now
字段中使用updated_at
,因此它将继承editable=False
和blank=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
字段应该是可编辑的,并且您的信号也应该正常工作。