2010-08-07 63 views
85

什么是自动为对象设置创建日期的最佳方式,以及当对象上次更新时将记录的字段?django模型表单对象的自动创建日期?

在我的模型,我有:

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

在我看来:

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 

我必须手动设置这个值,我自己?我认为这是传递给DateTimeFields的参数的要点(或者它们只是默认值,并且因为我设置了'editable = False',它们不会显示在窗体上,因此不会在请求中提交,因此不要放在表格中?)。

什么是这样做的最佳方式? init方法?

感谢

ps的 - 我是一个Django和Python新手...

回答

184

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

'auto_now'和'auto_now_add'被认为是邪恶的,所以尽量避免它们。 [这个答案](http://stackoverflow.com/a/1737078/1226722)解释了为什么,并提供了一个更好的方法,覆盖'save()'方法。 – gregoltsov 2014-01-30 13:15:44

+2

它产生了这个错误: '你试图添加一个不可空的字段'created_at'给游戏用户没有默认值;我们不能这样做(数据库需要一些东西来填充现有的行)。 请选择修复: 1)现在提供一次性的默认(将在现有的所有行设置) 2)退出,并让我加入models.py默认 选择一个选项:1 请进入默认值,作为有效的Python datetime和django.utils.timezone模块可用,所以你可以做eg timezone.now() >>> timezone.now()' – 2016-06-21 10:56:32

+0

删除数据库上的行,或者检查选项1并添加timezone.now() – mullerivan 2017-03-10 04:39:35