Python的Django框架中設(shè)置日期和字段可選的方法
設(shè)置字段可選
在擺弄了一會(huì)之后,你或許會(huì)發(fā)現(xiàn)管理工具有個(gè)限制:編輯表單需要你填寫每一個(gè)字段,然而在有些情況下,你想要某些字段是可選的。 舉個(gè)例子,我們想要Author模塊中的email字段成為可選,即允許不填。 在現(xiàn)實(shí)世界中,你可能沒有為每個(gè)作者登記郵箱地址。
為了指定email字段為可選,你只要編輯Book模塊(回想第五章,它在mysite/books/models.py文件里),在email字段上加上blank=True。代碼如下:
class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField(**blank=True** )
這些代碼告訴Django,作者的郵箱地址允許輸入一個(gè)空值。 所有字段都默認(rèn)blank=False,這使得它們不允許輸入空值。
這里會(huì)發(fā)生一些有趣的事情。 直到現(xiàn)在,除了__unicode__()方法,我們的模塊充當(dāng)數(shù)據(jù)庫中表定義的角色,即本質(zhì)上是用Python的語法來寫CREATE TABLE語句。 在添加blank=True過程中,我們已經(jīng)開始在簡(jiǎn)單的定義數(shù)據(jù)表上擴(kuò)展我們的模塊了。 現(xiàn)在,我們的模塊類開始成為一個(gè)富含Author對(duì)象屬性和行為的集合了。 email不但展現(xiàn)為一個(gè)數(shù)據(jù)庫中的VARCHAR類型的字段,它還是頁面中可選的字段,就像在管理工具中看到的那樣。
當(dāng)你添加blank=True以后,刷新頁面Add author edit form (http://127.0.0.1:8000/admin/books/author/add/ ),將會(huì)發(fā)現(xiàn)Email的標(biāo)簽不再是粗體了。 這意味它不是一個(gè)必填字段。 現(xiàn)在你可以添加一個(gè)作者而不必輸入郵箱地址,即使你為這個(gè)字段提交了一個(gè)空值,也再不會(huì)得到那刺眼的紅色信息“This field is required”。
設(shè)置日期型和數(shù)字型字段可選
雖然blank=True同樣適用于日期型和數(shù)字型字段,但是這里需要詳細(xì)講解一些背景知識(shí)。
SQL有指定空值的獨(dú)特方式,它把空值叫做NULL。NULL可以表示為未知的、非法的、或其它程序指定的含義。
在SQL中, NULL的值不同于空字符串,就像Python中None不同于空字符串("")一樣。這意味著某個(gè)字符型字段(如VARCHAR)的值不可能同時(shí)包含NULL和空字符串。
這會(huì)引起不必要的歧義或疑惑。 為什么這條記錄有個(gè)NULL,而那條記錄卻有個(gè)空字符串? 它們之間有區(qū)別,還是數(shù)據(jù)輸入不一致? 還有: 我怎樣才能得到全部擁有空值的記錄,應(yīng)該按NULL和空字符串查找么?還是僅按字符串查找?
為了消除歧義,Django生成CREATE TABLE語句自動(dòng)為每個(gè)字段顯式加上NOT NULL。 這里有個(gè)生成Author模塊的例子:
CREATE TABLE "books_author" ( "id" serial NOT NULL PRIMARY KEY, "first_name" varchar(30) NOT NULL, "last_name" varchar(40) NOT NULL, "email" varchar(75) NOT NULL ) ;
在大多數(shù)情況下,這種默認(rèn)的行為對(duì)你的應(yīng)用程序來說是最佳的,因?yàn)樗梢允鼓悴辉僖驍?shù)據(jù)一致性而頭痛。 而且它可以和Django的其它部分工作得很好。如在管理工具中,如果你留空一個(gè)字符型字段,它會(huì)為此插入一個(gè)空字符串(而* 不是*NULL)。
但是,其它數(shù)據(jù)類型有例外:日期型、時(shí)間型和數(shù)字型字段不接受空字符串。 如果你嘗試將一個(gè)空字符串插入日期型或整數(shù)型字段,你可能會(huì)得到數(shù)據(jù)庫返回的錯(cuò)誤,這取決于那個(gè)數(shù)據(jù)庫的類型。 (PostgreSQL比較嚴(yán)禁,會(huì)拋出一個(gè)異常;MySQL可能會(huì)也可能不會(huì)接受,這取決于你使用的版本和運(yùn)氣了。)在這種情況下,NULL是唯一指定空值的方法。 在Django模塊中,你可以通過添加null=True來指定一個(gè)字段允許為NULL。
因此,這說起來有點(diǎn)復(fù)雜: 如果你想允許一個(gè)日期型(DateField、TimeField、DateTimeField)或數(shù)字型(IntegerField、DecimalField、FloatField)字段為空,你需要使用null=True * 和* blank=True。
為了舉例說明,讓我們把Book模塊修改成允許 publication_date為空。修改后的代碼如下:
class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField(**blank=True, null=True** )
添加null=True比添加blank=True復(fù)雜。因?yàn)閚ull=True改變了數(shù)據(jù)的語義,即改變了CREATE TABLE語句,把publication_date字段上的NOT NULL刪除了。 要完成這些改動(dòng),我們還需要更新數(shù)據(jù)庫。
出于某種原因,Django不會(huì)嘗試自動(dòng)更新數(shù)據(jù)庫結(jié)構(gòu)。所以你必須執(zhí)行ALTER TABLE語句將模塊的改動(dòng)更新至數(shù)據(jù)庫。 像先前那樣,你可以使用manage.py dbshell進(jìn)入數(shù)據(jù)庫服務(wù)環(huán)境。 以下是在這個(gè)特殊情況下如何刪除NOT NULL:
ALTER TABLE books_book ALTER COLUMN publication_date DROP NOT NULL;
(注意:以下SQL語法是PostgreSQL特有的。)
我們將在第十章詳細(xì)講述數(shù)據(jù)庫結(jié)構(gòu)更改。
現(xiàn)在讓我們回到管理工具,添加book的編輯頁面允許輸入一個(gè)空的publication date。
相關(guān)文章
python安裝/卸載模塊方法步驟詳解(附詳細(xì)圖解)
在日常工作中會(huì)需要安裝或者卸載Python模塊.于是我整理了一下,下面這篇文章主要給大家介紹了關(guān)于python安裝/卸載模塊的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01AI人工智能 Python實(shí)現(xiàn)人機(jī)對(duì)話
這篇文章主要為大家詳細(xì)介紹了AI人工智能應(yīng)用,本文擬使用Python開發(fā)語言實(shí)現(xiàn)類似于WIndows平臺(tái)的“小娜”,,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11python 實(shí)現(xiàn)一個(gè)反向單位矩陣示例
今天小編就為大家分享一篇python 實(shí)現(xiàn)一個(gè)反向單位矩陣示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11python四種出行路線規(guī)劃的實(shí)現(xiàn)
路徑規(guī)劃中包括步行、公交、駕車、騎行等不同方式,今天借助高德地圖web服務(wù)api,實(shí)現(xiàn)出行路線規(guī)劃。感興趣的可以了解下2021-06-06使用?OpenAI?API?和?Python?使用?GPT-3的操作方法
這篇文章主要介紹了使用?OpenAI?API?和?Python?使用?GPT-3,在本文中,我們將使用?GPT-3。我將向您展示如何訪問它,并提供一些示例來說明您可以使用它做什么,以及您可以使用它構(gòu)建什么樣的應(yīng)用程序,需要的朋友可以參考下2023-03-03python抓取并保存html頁面時(shí)亂碼問題的解決方法
這篇文章主要介紹了python抓取并保存html頁面時(shí)亂碼問題的解決方法,結(jié)合實(shí)例形式分析了Python頁面抓取過程中亂碼出現(xiàn)的原因與相應(yīng)的解決方法,需要的朋友可以參考下2016-07-07