日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

基于Django OneToOneField和ForeignKey的區(qū)別詳解

瀏覽:26日期:2024-10-17 08:37:07

根據(jù)Django官方文檔介紹:

A one-to-one relationship. Conceptually, this is similar to a ForeignKey with unique=True, but the “reverse” side of the relation will directly return a single object.

OneToOneField與ForeignKey加上unique=True效果基本一樣,但是用OneToOneField反向關(guān)聯(lián)會直接返回對象。

相反地,使用ForeignKey, 反向關(guān)聯(lián)后會返回QuerySet。

例子:

from django.db import modelsclass Engine(models.Model): name = models.CharField(max_length=25) def __unicode__(self): return self.nameclass Car(models.Model): name = models.CharField(max_length=25) engine = models.OneToOneField(Engine) def __unicode__(self): return self.nameclass Engine2(models.Model): name = models.CharField(max_length=25) def __unicode__(self): return self.nameclass Car2(models.Model): name = models.CharField(max_length=25) engine = models.ForeignKey(Engine2, unique=True) def __unicode__(self): return self.name

在python manage.py shell里輸入:

>>> from testapp.models import Car, Engine>>> c = Car.objects.get(name=’Audi’)>>> e = Engine.objects.get(name=’Diesel’)>>> e.car # OneToOneField的反向關(guān)聯(lián)屬性如果沒有寫relate_name, 則是對方類名的小寫<Car: Audi>

>>> from testapp.models import Car2, Engine2>>> c2 = Car2.objects.get(name=’Mazda’)>>> e2 = Engine2.objects.get(name=’Wankel’)>>> e2.car2_set.all() # OneToOneField的反向關(guān)聯(lián)屬性如果沒有寫relate_name, 則是對方類名的小寫_set[<Car2: Mazda>]

補充知識:Django ForeignKey,ManyToManyField和OneToOneField的辨析

導(dǎo)引

模型(Models)是對網(wǎng)站所需信息種類的定義,其包含了網(wǎng)站存儲數(shù)據(jù)中的重要字段和數(shù)據(jù)行為。一般來說,一個模型對于數(shù)據(jù)庫中的一個表單。

字段(Fields)是模型的重要和唯一組成部分,他們由類別的屬性值所指定。

Field分類

由官方文檔Model field reference | Django Documentation定義:

Field一共分為AutoField、BinaryField、BooleanField、CharField、DateField、DecimalField、EmailField、FileField、FloatField、IntegerField、TextField、TimeField、URLField等類別,豐富的類別選項為數(shù)據(jù)庫存儲方式提供了完善的支持,而本文主要是針對如下三個關(guān)系型字段(Relationship fields):

關(guān)系型字段 對應(yīng)關(guān)系 ForeignKey 多對一 ManyToManyField 多對多 OneToOneField 一對一

分析

ForeignKey

首先查看源碼,在類的開頭有如下參數(shù):

many_to_many = Falsemany_to_one = Trueone_to_many = Falseone_to_one = False

由此可見,F(xiàn)oreignKey是many_to_one類型的,即“一對多”,我們引用官方文檔給出的示例:

from django.db import modelsclass Car(models.Model): manufacturer = models.ForeignKey( ’Manufacturer’, on_delete=models.CASCADE, ) # ...class Manufacturer(models.Model): # ... pass

由此我們可以看到,Car類型中有manufacturer字段,其類型是對應(yīng)Manufacturer類的ForeignKey。我們可以根據(jù)生活常識理解這種定義,由于一部汽車對應(yīng)一個生產(chǎn)商,而一個生產(chǎn)商可以對應(yīng)許多部汽車,所以兩者具有“一對多”的關(guān)系,在此種情況我們使用ForeignKey。

對于每個ForeignKey,我們需要給出關(guān)聯(lián)的模型和on_delete響應(yīng)的選項,即

manufacturer = models.ForeignKey( ’Manufacturer’, on_delete=models.CASCADE, )

on_delete函數(shù)的作用是在此字段被刪除的時候做出的響應(yīng),其可選項如下:

選項 功能 CASCADE 級聯(lián)刪除,此類選項模仿SQL語句ON DELETE CASCADE,再刪除此字段信息的時候同時刪除包含F(xiàn)oreignKey字段的目標(object) PROTECT 通過django.db.IntegrityError中的ProtectedError來保護此字段不被刪除,若進行刪除操作則拋出錯誤 SET_NULL 將ForeignKey置為空,這只在null選項為True的時候產(chǎn)生作用 SET_DEFAULT 設(shè)為默認值(default value),此默認值已預(yù)先對ForeignKey設(shè)置 SET() 對ForeignKey設(shè)置對SET()函數(shù)傳遞的數(shù)值 DO_NOTHING 不進行任何操作。若數(shù)據(jù)庫提高了引用完整性,則此種設(shè)置會拋出一個IntegrityError,除非對這一數(shù)據(jù)字段手動添加了SQL語句中的ON DELETE字段

還可以通過設(shè)置abstract屬性來定義一個抽象類:

from django.db import modelsclass AbstractCar(models.Model): manufacturer = models.ForeignKey(’Manufacturer’, on_delete=models.CASCADE) class Meta: abstract = True

ForeignKey還有如下的參數(shù)可以選擇:

參數(shù) 功能 limit_choices_to 通過一個限制對字段信息的某一可能選項進行約束,可以通過字典,函數(shù)或者查詢值來設(shè)置 related_name 可以指定關(guān)聯(lián)的類在本類中的名稱,通過這一參數(shù)可以用兩個字段名引用同一個類,通過這個名稱父類可以取得子類的值,默認為字段名 related_query_name 用于filter函數(shù)過濾和values函數(shù) to_field 關(guān)系關(guān)聯(lián)的相關(guān)對象名稱 db_constraint 控制在數(shù)據(jù)庫中是否應(yīng)該建立這一字段的約束 swappable 用于控制這一字段對于可交換類模型的行為

ManyToManyField

同樣在源碼中我們可以找到針對ManyToManyField的如下定義:

many_to_many = Truemany_to_one = Falseone_to_many = Falseone_to_one = False

由此可以知道,ManyToManyField是針對“many-to-many”即多對多關(guān)系定義的,它需要知道它關(guān)聯(lián)的類別。

官方文檔給出的示例代碼可以幫助理解:

from django.db import modelsclass Topping(models.Model): # ... passclass Pizza(models.Model): # ... toppings = models.ManyToManyField(Topping)

在示例代碼中,Pizza類的toppings字段由ManyToManyField與Toppings關(guān)聯(lián),我們可以由生活常識得出一片披薩上面會有很多種類的佐料,而一種佐料又可以用來制作多種披薩,兩者滿足“多對多”的關(guān)系。

ManyToManyField類有兩個經(jīng)常使用的參數(shù):through和through_fields,通過這兩個參數(shù)可以十分方便地建立中間項的關(guān)聯(lián),如示例代碼所示:

from django.db import modelsclass Person(models.Model): name = models.CharField(max_length=50)class Group(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField( Person, through=’Membership’, through_fields=(’group’, ’person’), )class Membership(models.Model): group = models.ForeignKey(Group, on_delete=models.CASCADE) person = models.ForeignKey(Person, on_delete=models.CASCADE) inviter = models.ForeignKey( Person, on_delete=models.CASCADE, related_name='membership_invites', ) invite_reason = models.CharField(max_length=64)

在Group類中有ManyToManyField類的字段members,這一字段通過through參數(shù)與membership聯(lián)系起來,后者表示“成員資格”,即表示“團體”與“個人”之間關(guān)系的中間項,而“through_fields”字段即為中間項連接起來的兩個類名,此處即group和person兩個類。

ManyToManyField還有以下參數(shù)可以選擇:

參數(shù) 功能 related_name 同F(xiàn)oreignKey,可以指定關(guān)聯(lián)的類在本類中的名稱 related_query_name 同F(xiàn)oreignKey,應(yīng)用于filter和values函數(shù) limit_choices_to 同F(xiàn)oreignKey,但如果自己定義了如“Membership”之類的中間類,則不會起到作用 symmetrical 對于迭代定義的ManyToManyField,其為這一字段建立一個單獨的屬性,而是設(shè)定symmetrical屬性為True,若期望使用此類迭代關(guān)系,可以手動設(shè)置其為False through 如上所示,用于設(shè)置中間項的名字,可以自己定義一個中間項,若不定義的話系統(tǒng)也會分配一個中間項 through_fields 通過元組來給出中間項關(guān)聯(lián)的兩個類名,可以查看上面的示例 db_table 可以通過這一屬性來手動設(shè)定保存這一字段的數(shù)據(jù)表名稱,若不設(shè)置則默認為字段的名稱 db_contraint 是否在數(shù)據(jù)庫中建立約束 swappable 設(shè)置是否指向一個可交換的模型

OneToOneField

源碼中對OneToOneField的設(shè)置如下:

many_to_many = Falsemany_to_one = Falseone_to_many = Falseone_to_one = True

可知其是針對單對單的關(guān)系設(shè)定的字段。在概念上我們可以理解其為設(shè)置unique屬性為True的一種類型,區(qū)別之處在于它“反向”的數(shù)值會返回一個目標值,這對于繼承關(guān)系的表達十分有用,例如一下示例程序:

from django.conf import settingsfrom django.db import modelsclass MySpecialUser(models.Model): user = models.OneToOneField( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, ) supervisor = models.OneToOneField( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name=’supervisor_of’, )

OneToOneField既包含F(xiàn)oreignKey中的參數(shù),又包含一個額外的參數(shù)parent_link,若定義了一個類,其繼承了一個非抽象的類,而設(shè)置parent_link這個函數(shù)為True,則會將這個類視作繼承的類的父類,而不是一個新的OneToOneField。

以上這篇基于Django OneToOneField和ForeignKey的區(qū)別詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標簽: Django
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜臀精品一区二区三区在线观看| 日本美女一区| 亚洲精品888| 亚洲国产成人精品女人| 狠狠操综合网| 日韩精品一二三四| 日本不卡视频在线| 国产剧情在线观看一区| 麻豆中文一区二区| 日韩欧美网址| 国产一区二区中文| 男人操女人的视频在线观看欧美| 欧美 日韩 国产精品免费观看| 欧美69视频| 亚洲三级国产| 久久伊人久久| 亚洲国产影院| 91成人在线| 国产高清不卡| 亚洲综合另类| 国产精品久久久久久av公交车 | 今天的高清视频免费播放成人| 午夜在线精品偷拍| 麻豆精品在线观看| 亚洲性色视频| 日韩福利在线观看| 电影91久久久| 亚洲激情av| 国产免费久久| 欧美一区二区三区激情视频| 视频一区中文字幕精品| 国产福利电影在线播放| 久久亚洲风情| 9999国产精品| 深夜福利一区| 成人片免费看| 日韩av不卡一区二区| 日韩欧美中文| 日韩精彩视频在线观看| 国产伦久视频在线观看| 亚洲视频国产精品| 国产一区二区三区视频在线| 久久国产福利| 国产麻豆久久| 欧美黑人巨大videos精品| 亚洲免费网址| 正在播放日韩精品| 欧美在线看片| 欧美一级专区| 欧美日韩色图| 中文字幕在线视频网站| 久久国产人妖系列| 免费日本视频一区| 久久一级电影| 精品视频在线观看网站| 免费视频最近日韩| 日韩欧美1区| 国产精品一区毛片| 亚洲婷婷丁香| 亚洲激情黄色| 日韩免费福利视频| 久久一区亚洲| 国产丝袜一区| 丝袜诱惑制服诱惑色一区在线观看| 成人污污视频| 国产精品流白浆在线观看| 亚洲在线久久| 亚洲一区二区三区免费在线观看 | 欧美三级第一页| 一区二区自拍| 亚洲91视频| 中文字幕高清在线播放| 麻豆一区二区三区| 国产亚洲字幕| 欧美午夜三级| 欧美天堂在线| **爰片久久毛片| 日本不卡高清视频| 快she精品国产999| 91成人网在线观看| 影视先锋久久| 在线视频观看日韩| 99精品在线| 国产欧美一区二区三区精品酒店| 国产精品片aa在线观看| 欧美日韩一区二区国产| 日本成人中文字幕| 亚洲美女久久| 色综合视频一区二区三区日韩 | 亚洲精品免费观看| 日韩制服丝袜先锋影音| 国产亚洲综合精品| 日韩视频一区| 久久亚洲美女| 天堂va在线高清一区| 热久久免费视频| 蜜桃久久久久久| 日欧美一区二区| 欧美日韩va| 欧美激情亚洲| 伊人久久在线| 亚洲午夜91| av成人国产| 免费人成在线不卡| 欧美在线黄色| 麻豆精品蜜桃视频网站| 精品精品99| 99久久九九| 亚洲免费在线| 日韩高清在线观看一区二区| 日韩二区在线观看| 国产精品主播在线观看| 精品久久97| 欧美日韩在线播放视频| 久久av在线| 久久激情综合网| 国产精品宾馆| 另类中文字幕国产精品| 国产精品人人爽人人做我的可爱| 免费日韩视频| 国产欧美一区二区精品久久久 | 久久99青青| 久久91导航| 亚洲中字黄色| 蜜桃久久久久久久| 国产美女久久| 亚洲91久久| 日韩精品福利一区二区三区| 久久精品人人| 亚洲欧美日本日韩| 欧美精品1区| 国产一区日韩一区| 日本一区二区三区中文字幕| 欧美激情aⅴ一区二区三区 | 亚洲精品无吗| 精品视频97| 久久青草久久| 蜜桃久久久久久久| 日韩成人a**站| 怡红院精品视频在线观看极品| 欧美日韩调教| 欧美1区2区3区| 国产日韩在线观看视频| 久久一区二区三区电影| 久久国产婷婷国产香蕉| 久久久久久久久久久9不雅视频| 亚洲精品大全| 伊伊综合在线| 欧美一区自拍| 一区二区视频欧美| 精品日产乱码久久久久久仙踪林| 91精品国产乱码久久久久久久| 日本亚洲欧洲无免费码在线| 色偷偷色偷偷色偷偷在线视频| 日韩高清一区在线| 欧美日韩在线观看视频小说| 国产精品国码视频| 国产精品毛片在线| 日韩在线观看| 欧美精品国产白浆久久久久| 91久久视频| а√在线中文在线新版| 欧美日韩一区自拍| 亚洲综合二区| 久久影视一区| 国产一区日韩| 亚洲视频电影在线| 蜜臀久久99精品久久一区二区| 国产精久久久| 午夜视频一区二区在线观看| 狠狠色狠狠色综合日日tαg| 国产乱码午夜在线视频| 国产日韩一区二区三区在线播放| 欧美大黑bbbbbbbbb在线| 国产成人久久精品一区二区三区| 亚洲一二三区视频| 蜜臀av免费一区二区三区| 国产成人精品一区二区三区免费| 综合激情一区| 最新亚洲一区| 亚洲精品国产嫩草在线观看| 日韩精品福利一区二区三区| 国产精品老牛| 国产高清一区二区| 日本美女一区| 国产夫妻在线| 荡女精品导航| 国产精品99久久免费| 青草久久视频| 日本亚洲不卡| 亚洲va久久| 亚洲3区在线| 日韩有吗在线观看| 亚洲欧美网站在线观看| 在线免费观看亚洲| 日本欧洲一区二区| 99日韩精品| 国产亚洲精品自拍| av不卡在线看| 亚洲一区国产一区|