建立django的model時,有DateTimeField、DateField和TimeField三種類型能夠用來建立日期字段,其值分別對應着datetime()、date()、time()三中對象。這三個field有着相同的參數auto_now和auto_now_add,表面上看起來很easy,但實際使用中很容易出錯,下面是一些注意點。html
auto_now 想要生效,自動修改時間,須要obj.save()django
這個參數的默認值爲false,設置爲true時,可以在保存該字段時,將其值設置爲當前時間,而且每次修改model,都會自動更新。所以這個參數在須要存儲「最後修改時間」的場景下,十分方便。須要注意的是,設置該參數爲true時,並不簡單地意味着字段的默認值爲當前時間,而是指字段會被「強制」更新到當前時間,你沒法程序中手動爲字段賦值;若是使用django再帶的admin管理器,那麼該字段在admin中是隻讀的。spa
這個參數的默認值也爲False,設置爲True時,會在model對象第一次被建立時,將字段的值設置爲建立時的時間,之後修改對象時,字段的值不會再更新。該屬性一般被用在存儲「建立時間」的場景下。與auto_now相似,auto_now_add也具備強制性,一旦被設置爲True,就沒法在程序中手動爲字段賦值,在admin中字段也會成爲只讀的。code
auto_now和auto_now_add被設置爲True後,這樣作會致使字段成爲editable=False和blank=True的狀態。editable=False將致使字段不會被呈如今admin中,blank=Ture表示容許在表單中不輸入值。此時,若是在admin的fields或fieldset中強行加入該日期時間字段,那麼程序會報錯,admin沒法打開;若是在admin中修改對象時,想要看到日期和時間,能夠將日期時間字段添加到admin類的readonly_fields中:htm
class YourAdmin(admin.ModelAdmin): readonly_fields = ('save_date', 'mod_date',) admin.site.register(Tag, YourAdmin)
那麼問題來了。實際場景中,每每既但願在對象的建立時間默認被設置爲當前值,又但願能在往後修改它。怎麼實現這種需求呢?對象
django中全部的model字段都擁有一個default參數,用來給字段設置默認值。能夠用default=timezone.now來替換auto_now=True或auto_now_add=True。timezone.now對應着django.utils.timezone.now(),所以須要寫成相似下面的形式:blog
from django.db import models import django.utils.timezone as timezone class Doc(models.Model): add_date = models.DateTimeField('保存日期',default = timezone.now) mod_date = models.DateTimeField('最後修改日期', auto_now = True)
https://www.cnblogs.com/huchong/p/7895263.html it