Django中的日期和時間、DateField.auto_now、DateField.auto_now_add


前言

創建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

  • 對於 DateFielddefault=date.today - 來自 datetime.date.today()

  • 對於 DateTimeFielddefault=timezone.now - 來自 django.utils.timezone.now()

選項 auto_now_addauto_nowdefault 是互斥的。這些選項的任何組合將導致錯誤

注解
按照目前的實現,將 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=Trueauto_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> 類似的過濾器。刷新頁面,即可正常顯示。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM