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

时间:2010-08-07 09:21:28

标签: python django django-models

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

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 个答案:

答案 0 :(得分:248)

您可以分别对updated_atcreated_at使用auto_nowauto_now_add选项。

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

答案 1 :(得分:9)

好吧,以上答案是正确的,auto_now_addauto_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中利用面向对象的可重用性(请勿重复)