成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

基于Django OneToOneField和ForeignKey的區別詳解

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

根據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反向關聯會直接返回對象。

相反地,使用ForeignKey, 反向關聯后會返回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的反向關聯屬性如果沒有寫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的反向關聯屬性如果沒有寫relate_name, 則是對方類名的小寫_set[<Car2: Mazda>]

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

導引

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

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

Field分類

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

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

關系型字段 對應關系 ForeignKey 多對一 ManyToManyField 多對多 OneToOneField 一對一

分析

ForeignKey

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

many_to_many = Falsemany_to_one = Trueone_to_many = Falseone_to_one = False

由此可見,ForeignKey是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字段,其類型是對應Manufacturer類的ForeignKey。我們可以根據生活常識理解這種定義,由于一部汽車對應一個生產商,而一個生產商可以對應許多部汽車,所以兩者具有“一對多”的關系,在此種情況我們使用ForeignKey。

對于每個ForeignKey,我們需要給出關聯的模型和on_delete響應的選項,即

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

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

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

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

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

ForeignKey還有如下的參數可以選擇:

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

ManyToManyField

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

many_to_many = Truemany_to_one = Falseone_to_many = Falseone_to_one = False

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

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

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

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

ManyToManyField類有兩個經常使用的參數:through和through_fields,通過這兩個參數可以十分方便地建立中間項的關聯,如示例代碼所示:

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參數與membership聯系起來,后者表示“成員資格”,即表示“團體”與“個人”之間關系的中間項,而“through_fields”字段即為中間項連接起來的兩個類名,此處即group和person兩個類。

ManyToManyField還有以下參數可以選擇:

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

OneToOneField

源碼中對OneToOneField的設置如下:

many_to_many = Falsemany_to_one = Falseone_to_many = Falseone_to_one = True

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

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既包含ForeignKey中的參數,又包含一個額外的參數parent_link,若定義了一個類,其繼承了一個非抽象的類,而設置parent_link這個函數為True,則會將這個類視作繼承的類的父類,而不是一個新的OneToOneField。

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

標簽: Django
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
6080日韩午夜伦伦午夜伦| 日本精品一级二级| 久久一区二区视频| 久久久久久久久久久一区 | 亚洲国产一区二区三区高清| 免费美女久久99| 国产午夜久久久久| 狠狠色狠狠色综合日日tαg| 国产在线视频一区二区三区| 亚洲欧美日韩人成在线播放| 亚洲成人免费影院| 欧美日韩另类一区| 精品不卡视频| 狠狠色狠狠色综合人人| 欧美日韩一区二区视频在线| 夫妻av一区二区| 成人在线视频一区| 国产精品区免费视频| 2017欧美狠狠色| 日本一区二区三区四区在线视频| 国产综合色视频| 91国偷自产一区二区开放时间 | 亚洲国产高清在线观看视频| 国产乱一区二区| 欧美男女性生活在线直播观看| 国产精品538一区二区在线| 欧美一区中文字幕| 国产精品性做久久久久久| 久久精品五月| 亚洲精品日韩综合观看成人91| 亚洲国产精品视频| 亚洲午夜久久久久| 麻豆成人综合网| 蜜臀av性久久久久蜜臀aⅴ四虎| 婷婷久久综合九色综合绿巨人 | 亚洲精品欧洲| 99久久精品国产一区| 成人av综合一区| 一区二区免费在线| 日韩高清在线电影| 国产精品2024| 夜色激情一区二区| 亚洲一区国产一区| 国产日产欧美一区二区三区| 蜜臀av在线播放一区二区三区| 欧洲av在线精品| 国产成人av一区二区三区在线| 99精品国产在热久久| 亚洲视频免费在线| 国产福利91精品| 欧美日韩视频不卡| 欧美日本精品| 欧美日韩第一区| 亚洲综合好骚| 色综合久久88色综合天天| 欧美日韩国产影片| 国产精品国产自产拍在线| 国产精品毛片在线看| 久久亚洲精精品中文字幕早川悠里| 久久激情中文| 国产福利一区在线| 在线看国产一区| 国产成人综合网| 久久精品人人做人人综合| 欧美精品一区二区三区在线看午夜| 亚洲精品亚洲人成人网在线播放| 麻豆国产欧美一区二区三区| 色婷婷综合中文久久一本| 欧美成人蜜桃| 麻豆国产精品一区二区三区| 国产拍揄自揄精品视频麻豆| 欧美性色综合网| 成人av在线网| 久久综合久久久久88| 99久久国产综合精品麻豆| 成熟亚洲日本毛茸茸凸凹| 久久精品在这里| 欧美日韩高清一区二区不卡| 日本一二三不卡| 亚洲女人av| 免费看欧美女人艹b| 久久精品电影| 日韩av在线发布| 国模套图日韩精品一区二区| 美国十次综合导航| 欧美亚洲免费| 国产精品久久久久7777按摩| 精品福利av| 久久成人免费网站| 国产亚洲精品自拍| 亚洲一二三区精品| 亚洲一区二区免费看| 另类小说图片综合网| 日韩三级视频在线观看| 亚洲欧洲日本国产| 亚洲免费观看在线视频| 欧美一区二区网站| 国产精品v欧美精品v日本精品动漫 | 米奇777在线欧美播放| 欧美性大战久久久久久久蜜臀| 精品动漫一区二区三区在线观看| 欧美日韩影院| 成人av集中营| 国产精品自拍三区| 精品夜夜嗨av一区二区三区| 视频一区二区欧美| 亚洲日本在线a| 日韩一区欧美小说| 国产亚洲一区二区三区| 日韩精品一区二区三区swag| 亚洲欧洲精品一区二区三区波多野1战4 | 色诱亚洲精品久久久久久| 欧美亚洲动漫精品| 欧美主播一区二区三区| 99精品99| 亚洲精品美女久久7777777| 狠狠干综合网| 99精品久久免费看蜜臀剧情介绍| 国产在线一区二区| 日韩黄色免费电影| 日本伊人精品一区二区三区观看方式| 麻豆国产91在线播放| 久久国产人妖系列| 国产麻豆精品在线| 欧美一区91| 毛片一区二区三区| 九色综合国产一区二区三区| 国产成人综合亚洲网站| 国内精品福利| 国产日韩一区二区三区在线播放 | 成人午夜激情影院| 在线观看成人av电影| 亚洲国产欧美国产综合一区| 亚洲永久视频| 伊人久久婷婷| 亚洲午夜精品久久久久久app| 国产一区二区在线影院| 久久精品72免费观看| 成人精品国产一区二区4080| 狠狠久久综合婷婷不卡| 久久久999| 精品国产免费人成电影在线观看四季| 日本一区二区三区四区 | 亚洲最新视频在线观看| 国内精品免费**视频| 国产精品一区二区a| 欧美一区二区三区四区高清| 午夜精品福利一区二区蜜股av | 亚洲第一激情av| 国产精品自拍网站| 激情综合网址| 欧美日韩精品欧美日韩精品| 91精品国产综合久久婷婷香蕉| 日韩欧美中文字幕公布| 91片黄在线观看| 国产区日韩欧美| 欧美一级欧美一级在线播放| 国产精品国产三级国产aⅴ入口| 久久精品一二三| 日本不卡中文字幕| 国产毛片一区| 一区二区三区四区高清精品免费观看 | 老**午夜毛片一区二区三区| 国产麻豆精品一区二区| 日韩欧美国产一区在线观看| 精品裸体舞一区二区三区| 国产视频一区不卡| 一区二区三区在线视频免费| 亚洲成人tv网| 狠狠色丁香婷综合久久| 香港久久久电影| 日韩精品一区二| 亚洲国产精品欧美一二99| 99久久久久久| 久久亚洲国产精品一区二区| 在线播放亚洲一区| 图片区小说区区亚洲影院| 亚洲青色在线| 欧美va天堂va视频va在线| 美女性感视频久久| 成人免费精品视频| 最新亚洲一区| 欧美成人激情免费网| 国模无码大尺度一区二区三区| 在线一区二区三区四区五区 | 夜夜揉揉日日人人青青一国产精品| 成人黄色国产精品网站大全在线免费观看| 欧美日本在线看| 日韩精品91亚洲二区在线观看 | 99精品久久久久久| 精品国免费一区二区三区| 国产精品一品二品| 91精品国产色综合久久ai换脸| 色综合亚洲欧洲| 高清在线不卡av| 久久美女高清视频| 亚洲成人久久影院| 99久久国产综合色|国产精品| 色香蕉久久蜜桃| 国内精品嫩模私拍在线|