Django auto_now的行为

时间:2017-08-23 13:34:28

标签: django django-models

我有以下型号:

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。我希望只有在第一次保存/创建之后才有值。

我做错了吗?

2 个答案:

答案 0 :(得分:6)

在Django中,您有auto_nowauto_now_add两个。

来自文档:

  

9229

     

每次保存对象时自动将字段设置为(这意味着首次创建对象时)

     

DateField.auto_now

     

首次创建对象时,自动将字段设置为

<强> 修改

如果您希望首次创建对象时DateField.auto_now_add字段为updated_at,则可以将nullnull=True一起传递到auto_now=True

DateTimeField

答案 1 :(得分:0)

还有另一种方法可以做到这一点。最好执行wencakisa建议的操作,除非您在模型中使用save方法。

它是用documentation

编写的
  

仅在调用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