前言
創建django的model時,有DateTimeField、DateField和TimeField三種類型可以用來創建日期字段,其值分別對應着datetime()、date()、time()三種對象。這三個field有着相同的參數auto_now和auto_now_add,在實際使用中很容易出錯。
DateField
class DateField(auto_now=False, auto_now_add=False, **options) # 默認
日期,由
datetime.date
實例在Python中表示。有一些額外的可選參數(下面的有總結)
DateTimeField
class DateTimeField(auto_now=False, auto_now_add=False, **options)
日期和時間,由Python在 datetime.datetime
實例中表示。采用與 DateField
相同的額外參數。
TimeField
class TimeField(auto_now=False, auto_now_add=False, **options)
一個時間,在Python中由 datetime.time
實例表示。接受與 DateField
相同的自動填充選項。
關鍵點:auto_now和auto_now_add
-
DateField.
auto_now
-
每次保存對象時,自動將字段設置為現在。用於“最后修改”的時間戳。注意當前日期是使用 always;它不只是一個默認值,你可以覆蓋。
該字段僅在調用
Model.save()
時自動更新。在以其他方式(例如QuerySet.update()
)更新其他字段時,不會更新該字段,但您可以在此類更新中為字段指定自定義值。
-
DateField.
auto_now_add
-
在首次創建對象時自動將字段設置為現在。用於創建時間戳。注意當前日期是使用 always;它不只是一個默認值,你可以覆蓋。因此,即使在創建對象時為此字段設置了一個值,它也將被忽略。如果您想要修改此字段,請設置以下內容而不是
auto_now_add=True
:-
對於
DateField
:default=date.today
- 來自datetime.date.today()
-
對於
DateTimeField
:default=timezone.now
- 來自django.utils.timezone.now()
-
選項 auto_now_add
,auto_now
和 default
是互斥的。這些選項的任何組合將導致錯誤。
注解
按照目前的實現,將 auto_now 或 auto_now_add 設置為 True 將使該字段具有 editable=False 和 blank=True 設置。
注解
auto_now 和 auto_now_add 選項將始終在創建或更新時使用 默認時區中的日期。
如果你需要不同的東西,你可能想考慮簡單地使用自己的可調用的默認值或覆蓋 save(),
而不是使用 auto_now 或 auto_now_add;或者使用 DateTimeField 而不是 DateField
並且決定如何處理在顯示時間從日期時間到日期的轉換。
常見問題:如何將創建時間設置為“默認當前”並且可修改
在現實生產環境中,往往希望對象的創建時間默認設置為當前值,但又希望日后可以修改它,如何實現這種需求的呢。
django中所有的model字段都擁有一個default參數,用來給字段設置默認值(上面的文檔中有介紹)。
我們可以使用default=timezone.now()來替換auto_now=True或auto_now_add=True。
(default=timezone.now
對應 django.utils.timezone.now()
)
from django.db import models import django.utils.timezone as timezone class Test(models.Model): add_date = models.DateTimeField('保存日期',default = timezone.now) mod_date = models.DateTimeField('最后修改日期', auto_now = True
html頁面從數據庫中讀出DateTimeField字段時,顯示的時間格式和數據庫中存放的格式不一致,比如數據庫字段內容為2018-06-25 22:00:00,但是頁面顯示的卻是Apr. 25, 2018, 10 p.m.
為了頁面和數據庫中顯示一致,需要在頁面格式化時間,需要添加<td>{{ infor.updatetime|date:"Y-m-d H:i:s" }}</td> 類似的過濾器。刷新頁面,即可正常顯示。