自动设置对象的创建日期以及记录对象最后更新时间的字段的最佳方法是什么?

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__方法?


当前回答

您可以分别为updated_at和created_at使用auto_now和auto_now_add选项。

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

其他回答

好吧,上面的答案是正确的,auto_now_add和auto_now可以做到这一点,但最好是创建一个抽象类,并在任何需要created_at和updated_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中利用面向对象的可重用性(不要重复你自己)

您可以分别为updated_at和created_at使用auto_now和auto_now_add选项。

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