需求描述
一般在數(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_add
和 auto_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>