国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Django中日期處理注意事項與自定義時間格式轉換詳解

2020-01-04 14:54:11
字體:
來源:轉載
供稿:網友

前言

我們在用Django創建models時,常常會涉及時間日期字段的處理,Django里日期相關Field有DateTimeField、DateField和TimeField三種類型,看似簡單,但其中有一些容易出錯的地方需要注意;另外,如果不習慣Django的默認時間格式,也可以自定義的修改。

DateTimeField、DateField和TimeField,其值分別對應著Python里的datetime.datetime、datetime.date和datetime.time三個實例,這三個Field里都有兩個參數:auto_now和auto_now_add,默認值均為False。

auto_now參數說明:

每次保存對象時自動將字段值設置為當前時間,能夠在保存該字段時,將其值設置為當前時間,并且每次修改model,都會自動更新。因此這個參數在需要存儲“最后修改時間”的場景下,十分方便,常用類似“last-modified”或者"update_time"字段。

需要注意的是,該字段不能被手動修改覆蓋;當設置為true時,只有每次調用Model.save()時,才會強制更新為當前時間點;當用其他方式更新其他字段時并不會更新:比如用QuerySet.update()方法,即使為該字段指定一個自定義的值,該字段也不會有所更改。比較直觀的表現形式是,如果使用django自帶的admin管理器,那么該字段在admin中是只讀的,并且無法進行修改。

示例代碼如下:

class Datacenter(models.Model): id = models.UUIDField('機房ID', default=uuid.uuid4, primary_key=True) zone = models.ForeignKey(Zone, verbose_name='所在區域', on_delete=models.PROTECT) dc_name = models.CharField('機房', max_length=128, unique=True) networks = models.CharField('IP地址段', max_length=128, blank=True, unique=True) update_time = models.DateTimeField('更新時間', auto_now=True) def __str__(self): return self.dc_name class Meta: verbose_name = '機房配置' verbose_name_plural = '機房配置'

Datacenter的ModelAdmin代碼:

class DatacenterAdmin(admin.ModelAdmin): list_display = ['id', 'dc_name', 'zone', 'networks', 'update_time'] search_fields = ['dc_name', 'zone', 'networks'] list_filter = ['dc_name', 'zone'] ordering = ['networks', 'zone']admin.site.register(models.Datacenter, DatacenterAdmin)

Admin界面效果圖:

Django,時間格式

點擊編輯頁面,會發現找不到‘更新時間'的編輯處,因為此字段是只讀,且不允許手動修改,效果圖如下:

Django,時間格式

當頁面“save”之后,再觀察現在的‘更新時間'發現時間已經被修改:

Django,時間格式

auto_now_add參數說明:

設置為True時,會在model對象第一次被創建時,將字段的值設置為創建時的時間,以后修改對象時,字段的值不會再更新。該屬性通常被用在存儲“創建時間”的場景下。與auto_now類似,auto_now_add也具有強制性,一旦被設置為True,就無法在程序中手動為字段賦值,在admin中字段也會成為只讀的。

繼續沿用剛才的代碼示例,'update_time'的'auto_now'改完'auto_now_add',其他代碼不變:

class Datacenter(models.Model): id = models.UUIDField('機房ID', default=uuid.uuid4, primary_key=True) zone = models.ForeignKey(Zone, verbose_name='所在區域', on_delete=models.PROTECT) dc_name = models.CharField('機房', max_length=128, unique=True) networks = models.CharField('IP地址段', max_length=128, blank=True, unique=True) update_time = models.DateTimeField('更新時間', auto_now_add=True)

編輯更新北京聯通機房的IP地址段之后保存:

Django,時間格式

更改之后‘更新時間'并未發生改變(見下圖),因為‘auto_now_add'在對象創建完成后即不再更新:

Django,時間格式

如何實現可編輯

auto_now和auto_now_add被設置為True后,這樣做會導致字段成為editable=False和blank=True的狀態。editable=False將導致字段不會被呈現在admin中,blank=Ture表示允許在表單中不輸入值。此時,如果在admin的fields或fieldset中強行加入該日期時間字段,那么程序會報錯,admin無法打開;如果在admin中修改對象時,想要看到日期和時間,可以將日期時間字段添加到admin類的readonly_fields中:

readonly_fields = ('save_date', 'mod_date',)

那么問題來了。實際場景中,往往既希望在對象的創建時間默認被設置為當前值,又希望能在日后修改它。怎么實現這種需求呢?

django中所有的model字段都擁有一個default參數,用來給字段設置默認值。可以用default=timezone.now來替換auto_now=True或auto_now_add=True。timezone.now對應著django.utils.timezone.now(),代碼示例:

from django.utils import timezoneclass Datacenter(models.Model): id = models.UUIDField('機房ID', default=uuid.uuid4, primary_key=True) zone = models.ForeignKey(Zone, verbose_name='所在區域', on_delete=models.PROTECT) dc_name = models.CharField('機房', max_length=128, unique=True) networks = models.CharField('IP地址段', max_length=128, blank=True, unique=True) update_time = models.DateTimeField('更新時間', default=timezone.now()) def __str__(self):  return self.dc_name class Meta:  verbose_name = '機房配置'  verbose_name_plural = '機房配置'

這里'update_time'字段默認值改為timezone.now()后,再次編輯已經能看到相應‘更新時間'字段,并且可修改:

Django,時間格式

我們把時間天數加1天后,保存退出再觀察‘更新時間'已經變為自定義時間:

Django,時間格式

自定義日期格式:
剛創建的Django應用,可能你看到的日期顯示格式跟下圖類似(跟LANGUAGE_CODE和TIME_ZONE有關):

![可能的默認日期格式](http://i2.51cto.com/images/blog/201803/23/164dc709843a56536c09c9142775a553.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

如果不習慣這種格式,自己定義顯示格式的配置如下,更改Django的setting.py文件:

USE_L10N = FalseDATE_FORMAT = 'Y-m-d'DATETIME_FORMAT = 'Y-m-d H:i:s'

注意事項:如果USE_L10N設置為了True,那么語言環境規定的格式具有更高的優先級并將被應用,即DATE_FORMAT不生效。

這里可用的格式化字符串的其他寫法參見Django官方文檔:

<https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#date>;

Django,時間格式

Django,時間格式

另外在Django頁面渲染的時候,html頁面從數據庫中讀出DateTimeField字段時,顯示的時間格式和數據庫中存放的格式不一致,另外一個解決辦法:可以在頁面格式化時間,添加{{ Datacenter.updatetime|date:"Y-m-d H:i:s" }}類似的過濾器。之后刷新頁面,即可正常顯示。

相關文檔:

https://docs.djangoproject.com/en/2.0/ref/settings/

https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#std:templatefilter-date

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临汾市| 徐汇区| 吴江市| 固阳县| 柘荣县| 措美县| 灵璧县| 彰化市| 东平县| 永定县| 英超| 克什克腾旗| 沂源县| 息烽县| 榕江县| 中江县| 古丈县| 册亨县| 雅安市| 遂川县| 莲花县| 施秉县| 依安县| 乐亭县| 襄樊市| 丰原市| 青冈县| 西昌市| 丰县| 固始县| 鸡西市| 富锦市| 临江市| 东明县| 缙云县| 华安县| 三明市| 荃湾区| 临澧县| 抚顺县| 巴塘县|