Django 2 DateTimeField格式 在程序中手動賦值

需求描述

一般在數(shù)據(jù)模型中設(shè)置創(chuàng)建時間、更新時間的時候都會使用DateTimeField的格式入桂,也會設(shè)置時間自動設(shè)置份名,示例如下:

create_time = models.DateTimeField(auto_now_add=True, verbose_name='創(chuàng)建時間')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新時間')

可以看到上面使用了auto_now_addauto_now 作為自動設(shè)置時間。

  • DateTimeField.auto_now

這個參數(shù)的默認(rèn)值為false租副,設(shè)置為true時坐慰,能夠在保存該字段時,將其值設(shè)置為當(dāng)前時間用僧,并且每次修改model结胀,都會自動更新。因此這個參數(shù)在需要存儲“最后修改時間”的場景下责循,十分方便糟港。需要注意的是,設(shè)置該參數(shù)為true時院仿,并不簡單地意味著字段的默認(rèn)值為當(dāng)前時間秸抚,而是指字段會被“強(qiáng)制”更新到當(dāng)前時間,你無法程序中手動為字段賦值歹垫;如果使用django再帶的admin管理器剥汤,那么該字段在admin中是只讀的。

  • DateTimeField.auto_now_add

這個參數(shù)的默認(rèn)值也為False排惨,設(shè)置為True時吭敢,會在model對象第一次被創(chuàng)建時,將字段的值設(shè)置為創(chuàng)建時的時間暮芭,以后修改對象時鹿驼,字段的值不會再更新。該屬性通常被用在存儲“創(chuàng)建時間”的場景下谴麦。與auto_now類似蠢沿,auto_now_add也具有強(qiáng)制性,一旦被設(shè)置為True匾效,就無法在程序中手動為字段賦值舷蟀,在admin中字段也會成為只讀的。

從上面的說明來說面哼,如果設(shè)置了這兩個參數(shù)野宜,那么就不可以手動修改值了。那么魔策,如果我要設(shè)置一個可以手動賦值的DateTimeField字段匈子,該怎么設(shè)置,怎么賦值呢闯袒?

賦值的方法

其實(shí)DateTimeField字段對應(yīng)的就是Python里的datetime.datetime虎敦,也可以使用django.utils.timezone.now() 的方法來進(jìn)行時間設(shè)置游岳。

# 導(dǎo)入datetime
In [10]: import datetime

# 打印datetime的當(dāng)前時間格式
In [11]: datetime.datetime.now()
Out[11]: datetime.datetime(2019, 9, 19, 10, 40, 23, 944737)

# 導(dǎo)入django.utils.timezone
In [12]: from django.utils import timezone

# 打印當(dāng)前時間格式
In [13]: timezone.now()
Out[13]: datetime.datetime(2019, 9, 19, 10, 42, 33, 721221)

In [14]: datetime.datetime.now()
Out[14]: datetime.datetime(2019, 9, 19, 10, 42, 53, 180852)

In [15]: 

可以看到,每個打印出來的時間格式都是一致的其徙。下面來寫一個示例胚迫,分別用這兩個方法來賦值一下自定義的時間字段。

示例

設(shè)置兩個時間字段

task_startup_time = models.DateTimeField(blank=True, null=True, default=None, verbose_name='任務(wù)啟動執(zhí)行時間')
task_expected_end_time = models.DateTimeField(blank=True, null=True, default=None, verbose_name='任務(wù)預(yù)計(jì)結(jié)束時間')

完整模型類如下:

class TaskScenario(BaseModel):
    """任務(wù)場景"""
    users = models.IntegerField(verbose_name='并發(fā)用戶數(shù)')
    rate = models.IntegerField(verbose_name='每秒啟動用戶數(shù)')
    task_startup_time = models.DateTimeField(blank=True, null=True, default=None, verbose_name='任務(wù)啟動執(zhí)行時間')
    task_expected_end_time = models.DateTimeField(blank=True, null=True, default=None, verbose_name='任務(wù)預(yù)計(jì)結(jié)束時間')
    create_user = models.ForeignKey('user.User', blank=True, null=True, default=None,verbose_name='創(chuàng)建用戶',on_delete=models.SET_NULL) # 創(chuàng)建用戶

    class Meta:
        db_table = 'pf_task_scenario'
        verbose_name = '任務(wù)場景'
        verbose_name_plural = verbose_name
        ordering = ['id'] # 排序字段

執(zhí)行設(shè)置時間

In [1]: from tasks_manager.models import TaskScenario

In [4]: task_scenario = TaskScenario.objects.get(id=41)

In [5]: task_scenario.task_startup_time

In [6]: task_scenario.task_expected_end_time

In [10]: import datetime

In [11]: datetime.datetime.now()
Out[11]: datetime.datetime(2019, 9, 19, 10, 40, 23, 944737)

In [12]: from django.utils import timezone

In [13]: timezone.now()
Out[13]: datetime.datetime(2019, 9, 19, 10, 42, 33, 721221)

In [15]: task_scenario.task_startup_time = datetime.datetime.now()

In [16]: task_scenario.task_expected_end_time = timezone.now()

In [17]: task_scenario.save()

In [18]: task_scenario.task_startup_time
Out[18]: datetime.datetime(2019, 9, 19, 11, 7, 13, 499454)

In [19]: task_scenario.task_expected_end_time
Out[19]: datetime.datetime(2019, 9, 19, 11, 7, 33, 471270)

在mysql中查詢一下保存的時間數(shù)據(jù)看看唾那,如下:

mysql> select * from pf_task_scenario where id = 41 \G
*************************** 1. row ***************************
                    id: 41
           create_time: 2019-09-09 14:44:25.668503
           update_time: 2019-09-19 11:07:38.133910
             is_delete: 0
                 users: 1000
                  rate: 100
        create_user_id: 5
task_expected_end_time: 2019-09-19 11:07:33.471270 # 使用datetime.datetime.now()访锻,可以看到兩個時間參數(shù)的數(shù)據(jù)基本一致
     task_startup_time: 2019-09-19 11:07:13.499454 # 使用timezone.now()可以看到兩個時間參數(shù)的數(shù)據(jù)基本一致
1 row in set (0.00 sec)

mysql> 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市闹获,隨后出現(xiàn)的幾起案子期犬,更是在濱河造成了極大的恐慌,老刑警劉巖避诽,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件龟虎,死亡現(xiàn)場離奇詭異,居然都是意外死亡茎用,警方通過查閱死者的電腦和手機(jī)遣总,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轨功,“玉大人旭斥,你說我怎么就攤上這事」沤В” “怎么了垂券?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長羡滑。 經(jīng)常有香客問我菇爪,道長,這世上最難降的妖魔是什么柒昏? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任凳宙,我火速辦了婚禮,結(jié)果婚禮上职祷,老公的妹妹穿的比我還像新娘氏涩。我一直安慰自己,他們只是感情好有梆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布是尖。 她就那樣靜靜地躺著,像睡著了一般泥耀。 火紅的嫁衣襯著肌膚如雪饺汹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天痰催,我揣著相機(jī)與錄音兜辞,去河邊找鬼迎瞧。 笑死,一個胖子當(dāng)著我的面吹牛弦疮,可吹牛的內(nèi)容都是我干的夹攒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼胁塞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了压语?” 一聲冷哼從身側(cè)響起啸罢,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胎食,沒想到半個月后扰才,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厕怜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年衩匣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粥航。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡琅捏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出递雀,到底是詐尸還是另有隱情柄延,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布缀程,位于F島的核電站搜吧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杨凑。R本人自食惡果不足惜滤奈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撩满。 院中可真熱鬧蜒程,春花似錦、人聲如沸鹦牛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曼追。三九已至窍仰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間礼殊,已是汗流浹背驹吮。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工针史, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碟狞。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓啄枕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親族沃。 傳聞我的和親對象是個殘疾皇子频祝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容