2010-08-07 55 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