Django學(xué)習(xí)-第七講:django 中的常用字段廓旬、字段屬性哼审,外鍵和表關(guān)系、外鍵操作

1. django中的常用字段

1. AutoField

映射到數(shù)據(jù)庫中是int類型孕豹,可以有自動增長的特性涩盾。一般不需要使用這個類型,如果不指定主鍵励背,那么模型會自動的生成一個叫做id的自動增長的主鍵春霍。如果你想指定一個其他名字的并且具有自動增長的主鍵,使用AutoField也是可以的叶眉。

2. BigAutoField

64位的整形址儒,類似于AutoField芹枷,只不過是產(chǎn)生的數(shù)據(jù)的范圍是從1-9223372036854775807。

3. BooleanField

在模型層面接收的是True/False莲趣。在數(shù)據(jù)庫層面是tinyint類型鸳慈。如果沒有指定默認(rèn)值,默認(rèn)值是None喧伞。

4. CharField

在數(shù)據(jù)庫層面是varchar類型走芋。在Python層面就是普通的字符串。這個類型在使用的時候必須要指定最大的長度(max_lenth)潘鲫,也即必須要傳遞max_length這個關(guān)鍵字參數(shù)進去翁逞。
(choice = )

最大長度計算:https://www.cnblogs.com/canger/p/9850727.html

5. DateTimeField

日期時間類型,不僅僅可以存儲日期次舌,還可以存儲時間熄攘。映射到數(shù)據(jù)庫中是datetime類型。
在django中是有時區(qū)的概念的彼念,使用時要考慮到時區(qū)的問題挪圾,默認(rèn)使用的是 UTC時區(qū),分為 navie(沒時區(qū)) 和 aware(有時區(qū))逐沙,如果項目不是國際的哲思,可以我們將時區(qū)關(guān)閉,使用本地的時間吩案。
我們可以在settings.py 中修改相應(yīng)的時區(qū)和是否使用時區(qū)

TIME_ZONE = 'Asia/Shanghai'
USE_TZ= True  # 為True意味在項目中使用的是 aware 時間棚赔,如果為false則意味著使用的是 navie 時間
TIME_ZONE = 'Asia/Shanghai'

from django.utils.timezone import localtime,now

auto_now:在每次這個數(shù)據(jù)保存的時候,都使用當(dāng)前的時間徘郭。
比如作為一個記錄修改日期的字段靠益,可以將這個屬性設(shè)置為True。

auto_now_add:在每次數(shù)據(jù)第一次被添加進去的時候残揉,都使用當(dāng)前的時間胧后。
比如作為一個記錄第一次入庫的字段,可以將這個屬性設(shè)置為True抱环。

6. EmailField

類似于CharField壳快。在數(shù)據(jù)庫底層也是一個varchar類型。最大長度是254個字符镇草。

7. FileField

用來存儲文件的眶痰。(upload_to= )指定存儲到哪個目錄下

8. ImageField

用來存儲圖片文件的。(upload_to= )指定存儲到哪個目錄下

9. FloatField

浮點類型梯啤。映射到數(shù)據(jù)庫中是float類型竖伯。

10.IntegerField

整形。值的區(qū)間是-2147483648——2147483647因宇。

11. BigIntegerField

大整形黔夭。值的區(qū)間是-9223372036854775808——9223372036854775807宏胯。

12. PositiveIntegerField

正整形羽嫡。值的區(qū)間是0——2147483647本姥。

13. SmallIntegerField

小整形。值的區(qū)間是-32768——32767杭棵。

14. PositiveSmallIntegerField

正小整形婚惫。值的區(qū)間是0——32767。

15. TextField

大量的文本類型魂爪。映射到數(shù)據(jù)庫中是longtext類型先舷。

16. UUIDField

只能存儲uuid格式的字符串。uuid是一個32位的全球唯一的字符串滓侍,一般用來作為主鍵蒋川。

17. URLField

類似于CharField,只不過只能用來存儲url格式的字符串撩笆。并且默認(rèn)的max_length是200捺球。

2. 字段中的常用屬性

1. null

如果設(shè)置為True,Django將會在映射表的時候指定是否為空夕冲。默認(rèn)是為False氮兵。在使用字符串相關(guān)的Field(CharField/TextField)的時候,官方推薦盡量不要使用這個參數(shù)歹鱼,也就是保持默認(rèn)值False泣栈。因為Django在處理字符串相關(guān)的Field的時候,即使這個Field的null=False弥姻,如果你沒有給這個Field傳遞任何值南片,那么Django也會使用一個空的字符串""來作為默認(rèn)值存儲進去。因此如果再使用null=True庭敦,Django會產(chǎn)生兩種空值的情形(NULL或者空字符串)疼进。如果想要在表單驗證的時候允許這個字符串為空,那么建議使用blank=True螺捐。如果你的Field是BooleanField颠悬,那么對應(yīng)的可空的字段則為NullBooleanField。

2. db_column

這個字段在數(shù)據(jù)庫中的名字定血。如果沒有設(shè)置這個參數(shù)赔癌,那么將會使用模型中屬性的名字。

3. default

默認(rèn)值澜沟≡制保可以為一個值,或者是一個函數(shù)茫虽,但是不支持lambda表達式刊苍。并且不支持列表/字典/集合等可變的數(shù)據(jù)結(jié)構(gòu)既们。

4. primary_key

是否為主鍵。默認(rèn)是False正什。

5. unique

在表中這個字段的值是否唯一啥纸。一般是設(shè)置手機號碼/郵箱等。

更多Field參數(shù)請參考官方文檔:https://docs.djangoproject.com/zh-hans/2.2/ref/models/fields/

3. 模型中Meta配置

對于一些模型級別的配置婴氮。我們可以在模型中定義一個類斯棒,叫做Meta。然后在這個類中添加一些類屬性來控制模型的作用主经。比如我們想要在數(shù)據(jù)庫映射的時候使用自己指定的表名荣暮,而不是使用模型的名稱。那么我們可以在Meta類中添加一個db_table的屬性罩驻。

class Book(models.Model):
    name = models.CharField(max_length=20,null=False)
    desc = models.CharField(max_length=100,name='description',db_column="description1")

    class Meta:
        db_table = 'book_model'

1. db_table

這個模型映射到數(shù)據(jù)庫中的表名穗酥。如果沒有指定這個參數(shù),那么在映射的時候?qū)褂媚P兔麃碜鳛槟J(rèn)的表名惠遏。

2. ordering

設(shè)置在提取數(shù)據(jù)的排序方式砾跃。比如我想在查找數(shù)據(jù)的時候根據(jù)添加的時間排序

class Book(models.Model):
    name = models.CharField(max_length=20,null=False)
    desc = models.CharField(max_length=100,name='description',db_column="description1")
    pub_date = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'book_model'
        ordering = ['pub_date']     # 正序
        ordering = ['-pub_date']    # 倒序

3.verbose_name

設(shè)置在django后臺管理 admin 中顯示的中文名稱

class Book(models.Model):
    name = models.CharField(max_length=20,null=False)
    desc = models.CharField(max_length=100,name='description',db_column="description1")
    pub_date = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'book_model'
        ordering = ['pub_date']     # 正序
        ordering = ['-pub_date']    # 倒序
        verbose_name = '圖書信息'
        verbose_name_plural = verbose_name

4. 外鍵和表關(guān)系

在MySQL中,表有兩種引擎爽哎,一種是InnoDB蜓席,另外一種是myisam。如果使用的是InnoDB引擎课锌,是支持外鍵約束的厨内。外鍵的存在使得ORM框架在處理表關(guān)系的時候異常的強大。因此這里我們首先來介紹下外鍵在Django中的使用渺贤。

類定義為class ForeignKey(to,on_delete,**options)雏胃。第一個參數(shù)是引用的是哪個模型,第二個參數(shù)是在使用外鍵引用的模型數(shù)據(jù)被刪除了志鞍,這個字段該如何處理瞭亮,比如有CASCADE、SET_NULL等固棚。這里以一個實際案例來說明统翩。比如有一個Category和一個Article兩個模型。一個Category可以有多個文章此洲,一個Article只能有一個Category厂汗,并且通過外鍵進行引用。

class Category(models.Model):
    name = models.CharField(max_length=100)

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    # author = models.ForeignKey("User",on_delete=models.CASCADE)
    category = models.ForeignKey("Category",on_delete=models.CASCADE)

以上使用ForeignKey來定義模型之間的關(guān)系呜师。即在article的實例中可以通過author屬性來操作對應(yīng)的User模型娶桦。這樣使用起來非常的方便。

from django.shortcuts import render
from django.http import HttpResponse
from .models import Article,Category
# Create your views here.

def index(request):
    category = Category(name="news")
    category.save()
    article = Article(title='PHP',content='123')
    article.category = category
    article.save()
    article = Article.objects.first()

    # 獲取文章分類名稱
    article = Article.objects.first()
    print(article.category.name)

為什么使用了ForeignKey后,就能通過author訪問到對應(yīng)的user對象呢衷畦。因此在底層栗涂,Django為Article表添加了一個屬性名_id的字段(比如author的字段名稱是author_id),這個字段是一個外鍵祈争,記錄著對應(yīng)的作者的主鍵斤程。以后通過article.author訪問的時候,實際上是先通過author_id找到對應(yīng)的數(shù)據(jù)铛嘱,然后再提取User表中的這條數(shù)據(jù)暖释,形成一個模型。

如果想要引用另外一個app的模型墨吓,那么應(yīng)該在傳遞to參數(shù)的時候,使用app.model_name進行指定纹磺。以上例為例帖烘,如果User和Article不是在同一個app中

# User模型在user這個app中
class User(models.Model):
    username = models.CharField(max_length=20)
    password = models.CharField(max_length=100)

# Article模型在article這個app中
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

    author = models.ForeignKey("user.User",on_delete=models.CASCADE)

如果模型的外鍵引用的是本身自己這個模型,那么to參數(shù)可以為'self'橄杨,或者是這個模型的名字秘症。在論壇開發(fā)中,一般評論都可以進行二級評論式矫,即可以針對另外一個評論進行評論乡摹,那么在定義模型的時候就需要使用外鍵來引用自身

class Comment(models.Model):
    content = models.TextField()
    origin_comment = models.ForeignKey('self',on_delete=models.CASCADE,null=True)
    # 或者
    # origin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE,null=True)

4.1 外鍵刪除操作

如果一個模型使用了外鍵。那么在對方那個模型被刪掉后采转,該進行什么樣的操作聪廉。可以通過on_delete來指定故慈“逍埽可以指定的類型如下:

  • 1.CASCADE:級聯(lián)操作。如果外鍵對應(yīng)的那條數(shù)據(jù)被刪除了察绷,那么這條數(shù)據(jù)也會被刪除干签。

  • 2.PROTECT:受保護。即只要這條數(shù)據(jù)引用了外鍵的那條數(shù)據(jù)拆撼,那么就不能刪除外鍵的那條數(shù)據(jù)容劳。

  • 3.SET_NULL:設(shè)置為空。如果外鍵的那條數(shù)據(jù)被刪除了闸度,那么在本條數(shù)據(jù)上就將這個字段設(shè)置為空竭贩。如果設(shè)置這個選項,前提是要指定這個字段可以為空筋岛。

  • 4.SET_DEFAULT:設(shè)置默認(rèn)值娶视。如果外鍵的那條數(shù)據(jù)被刪除了,那么本條數(shù)據(jù)上就將這個字段設(shè)置為默認(rèn)值。如果設(shè)置這個選項肪获,前提是要指定這個字段一個默認(rèn)值寝凌。

  • 5.SET():如果外鍵的那條數(shù)據(jù)被刪除了。那么將會獲取SET函數(shù)中的值來作為這個外鍵的值孝赫。SET函數(shù)可以接收一個可以調(diào)用的對象(比如函數(shù)或者方法)较木,如果是可以調(diào)用的對象,那么會將這個對象調(diào)用后的結(jié)果作為值返回回去青柄。

  • 6.DO_NOTHING:不采取任何行為伐债。一切全看數(shù)據(jù)庫級別的約束。

以上這些選項只是Django級別的致开,數(shù)據(jù)級別依舊是RESTRICT峰锁!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市双戳,隨后出現(xiàn)的幾起案子虹蒋,更是在濱河造成了極大的恐慌,老刑警劉巖飒货,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魄衅,死亡現(xiàn)場離奇詭異,居然都是意外死亡塘辅,警方通過查閱死者的電腦和手機晃虫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扣墩,“玉大人哲银,你說我怎么就攤上這事【诎瘢” “怎么了盘榨?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蟆融。 經(jīng)常有香客問我草巡,道長,這世上最難降的妖魔是什么型酥? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任山憨,我火速辦了婚禮,結(jié)果婚禮上弥喉,老公的妹妹穿的比我還像新娘郁竟。我一直安慰自己,他們只是感情好由境,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布棚亩。 她就那樣靜靜地躺著蓖议,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讥蟆。 梳的紋絲不亂的頭發(fā)上勒虾,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音瘸彤,去河邊找鬼修然。 笑死,一個胖子當(dāng)著我的面吹牛质况,可吹牛的內(nèi)容都是我干的愕宋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼结榄,長吁一口氣:“原來是場噩夢啊……” “哼中贝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起潭陪,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雄妥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡逼肯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年膜钓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片醋拧。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡慷嗜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丹壕,到底是詐尸還是另有隱情庆械,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布菌赖,位于F島的核電站缭乘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琉用。R本人自食惡果不足惜堕绩,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邑时。 院中可真熱鬧奴紧,春花似錦、人聲如沸晶丘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沫浆。三九已至捷枯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間件缸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涩笤,地道東北人蹬碧。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓罗心,卻偏偏與公主長得像渤闷,于是被迫代替她去往敵國和親认然。 傳聞我的和親對象是個殘疾皇子岩瘦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

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