Django模型表单对象的自动创建日期

249 投票
2 回答
207238 浏览
提问于 2025-04-16 02:27

怎样才能自动为一个对象设置创建日期,同时还要有一个字段记录这个对象最后一次更新的时间呢?

models.py:

created_at = models.DateTimeField(False, True, editable=False)
updated_at = models.DateTimeField(True, True, editable=False)

views.py:

if request.method == 'POST':
    form = MyForm(request.POST)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.user = request.user
        obj.save()
        return HttpResponseRedirect('obj_list')

我遇到了这个错误:

objects_object.created_at may not be NULL

我是不是需要自己手动设置这个值?我以为传给DateTimeField的参数就是为了这个(还是说这些参数只是默认值,因为我设置了editable=False,所以它们在表单中不显示,结果也就没被提交到请求中,因此没有被放到表单里?)。

这样做的最佳方法是什么呢?用一个__init__方法吗?

2 个回答

115

其实,上面的回答是对的,auto_now_addauto_now 可以解决这个问题。不过,最好是创建一个抽象类,这样在需要 created_atupdated_at 字段的模型里都可以使用。

class TimeStampMixin(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

这样的话,你只需要简单地继承这个抽象类,就可以在你创建的任何模型中使用时间戳了。

class Posts(TimeStampMixin):
    name = models.CharField(max_length=50)
    ...
    ...

通过这种方式,你可以利用面向对象的可重用性,这在Django中符合DRY原则(不要重复自己)。

478

你可以使用 auto_nowauto_now_add 这两个选项,分别来设置 updated_atcreated_at 的时间。

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

撰写回答