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


152

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

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

Answers:


310

您可以分别为和使用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)

31
auto_now并且auto_now_add被认为是邪恶的,所以请尽量避免。该答案说明了原因,并提供了更好的方法来覆盖该save()方法。
gregoltsov 2014年

3
它会产生此错误:You are trying to add a non-nullable field 'created_at' to gameuser without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows) 2) Quit, and let me add a default in models.py Select an option: 1 Please enter the default value now, as valid Python The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now() >>> timezone.now()
Kaleem Ullah

1
删除数据库上的行,或选中选项1并添加timezone.now()
mullerivan

选择一个选项:1请立即输入默认值,作为有效的Python。datetime和django.utils.timezone模块可用,因此您可以执行例如timezone.now()>>> timezone.now()的“ aml_validations”迁移:
mullerivan


26

好吧,上面的答案是正确的,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中利用面向对象的可重用性(不要重复自己)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.