我有以下型号:
class MetaData(models.Model):
created_at = models.DateTimeField(auto_now_add=True, auto_now=False)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True,
related_name='%(app_label)s_%(class)s_created_by')
updated_at = models.DateTimeField(auto_now_add=False, auto_now=True)
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True,
related_name='%(app_label)s_%(class)s_updated_by')
update_at字段也在创建时使用值完成,而不是为null。我希望只有在第一次保存/创建之后才有值。
我做错了吗?
答案 0 :(得分:6)
在Django中,您有auto_now
和auto_now_add
两个。
来自文档:
9229
每次保存对象时自动将字段设置为。(这意味着首次创建对象时)
DateField.auto_now
首次创建对象时,自动将字段设置为 。
<强> 修改 强>:
如果您希望首次创建对象时DateField.auto_now_add
字段为updated_at
,则可以将null
与null=True
一起传递到auto_now=True
:
DateTimeField
答案 1 :(得分:0)
还有另一种方法可以做到这一点。最好执行wencakisa建议的操作,除非您在模型中使用save
方法。
仅在调用Model.save()时自动更新该字段。的 以其他方式对其他字段进行更新时,该字段未更新 例如QuerySet.update(),尽管您可以为 像这样的更新中的字段。
因此,即使您使用auto_now
,但是例如调用save
方法来生成一个子地址,创建对象时,时间也会用auto_now
分配给该字段
如何处理这种情况,并在创建之后和更新之前将字段updated_at
保留为null
?
例如,如果您使用的是UpdateView,请使用form_valid
方法在此指定时间。
models.py
class MetaData(models.Model):
created_at = models.DateTimeField(auto_now_add=True, auto_now=False)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True,
related_name='%(app_label)s_%(class)s_created_by')
updated_at = models.DateTimeField(null=True)
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True,
related_name='%(app_label)s_%(class)s_updated_by')
def save(self, *args, **kwargs):
# SOMETHING HERE
super().save(*args, **kwargs)
views.py
class UpdateMetaData(generic.UpdateView):
# SOMETHING HERE
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.updated_at = timezone.now()
self.object.save()
return super().form_valid(form)
创建后,null
的值为updated_at
,字段更新后,正确的时间值为。
我认为您也可以以同样的方式将更新作者分配给updated_by
。