最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django框架多表查詢實(shí)例分析

 更新時(shí)間:2018年07月04日 10:46:23   作者:-Finley-  
這篇文章主要介紹了Django框架多表查詢,結(jié)合實(shí)例形式分析了Django框架實(shí)現(xiàn)多表查詢的外鍵、關(guān)聯(lián)、前向查詢、反向查詢等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Django框架多表查詢。分享給大家供大家參考,具體如下:

多表查詢是模型層的重要功能之一, Django提供了一套基于關(guān)聯(lián)字段獨(dú)特的解決方案.

ForeignKey

來自Django官方文檔的模型示例:

from django.db import models
class Blog(models.Model):
  name = models.CharField(max_length=100)
  tagline = models.TextField()
class Author(models.Model):
  name = models.CharField(max_length=50)
  email = models.EmailField()
class Entry(models.Model):
  blog = models.ForeignKey(Blog)
  authors = models.ManyToManyField(Author)
  headline = models.CharField(max_length=255)
  body_text = models.TextField()
  pub_date = models.DateField()
  mod_date = models.DateField()
  n_comments = models.IntegerField()
  n_pingbacks = models.IntegerField()
  rating = models.IntegerField()

class ForeignKey

ForeignKey字段接受一個(gè)Model類作為參數(shù), 類型與被參照的字段完全相同:

blog = models.ForeignKey(Blog)

ForeignKey.to_field

關(guān)聯(lián)到的關(guān)聯(lián)對(duì)象的字段名稱。默認(rèn)地,Django 使用關(guān)聯(lián)對(duì)象的主鍵。

blog = models.ForeignKey(Blog, to_field=Blog.name)

ForeignKey.db_constraint

Django Model的ForeignKey字段的主要功能是維護(hù)一個(gè)一對(duì)多的關(guān)系, 以進(jìn)行關(guān)聯(lián)查詢.

只有在db_constraint=True時(shí)Django model才會(huì)在數(shù)據(jù)庫上建立外鍵約束, 在該值為False時(shí)不建立約束.

默認(rèn)db_constraint=True.

ForeignKey.related_name

這個(gè)名稱用于讓關(guān)聯(lián)的對(duì)象反查到源對(duì)象.

如果你不想讓Django 創(chuàng)建一個(gè)反向關(guān)聯(lián),請(qǐng)?jiān)O(shè)置related_name 為 '+' 或者以'+' 結(jié)尾.

ForeignKey.related_query_nameForeignKey.related_name作為默認(rèn)值, 兩者功能的具體說明請(qǐng)參見相關(guān)文檔

使用ForeignKey查詢

前向查詢

若關(guān)系模型A包含與模型B關(guān)聯(lián)的關(guān)聯(lián)字段, 模型A的實(shí)例可以通過關(guān)聯(lián)字段訪問與其關(guān)聯(lián)的模型B的實(shí)例:

>>> e = Entry.objects.get(id=2)
>>> e.blog # Returns the related Blog object.

修改e.blog并調(diào)用save方法存入數(shù)據(jù)庫

>>> e.blog = some_blog
>>> e.save()

如果ForeignKey 字段有null=True 設(shè)置(即它允許NULL值),可以分配None來刪除對(duì)應(yīng)的關(guān)聯(lián)性

>>> e = Entry.objects.get(id=2)
>>> e.blog = None
>>> e.save() # "UPDATE blog_entry SET blog_id = NULL ...;"

Django提供了一種使用雙下劃線__的查詢語法:

>>> Entry.objects.filter(blog__name='Beatles Blog')

反向查詢

被索引的關(guān)系模型可以訪問所有參照它的模型的實(shí)例,如Entry.blog作為Blog的外鍵,默認(rèn)情況下Blog.entry_set是包含所有參照Blog的Entry示例的查詢集,可以使用查詢集API取出相應(yīng)的實(shí)例。

>>>b = Blog.objects.get(id=1)
>>>b.entry_set.all()

Entry.blog的related_name和related_query_name可以設(shè)置該查詢集的名字。

ManyToManyField

來自Django官網(wǎng)的示例:

from django.db import models
class 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)
  person = models.ForeignKey(Person)
  inviter = models.ForeignKey(Person, related_name="membership_invites")
  invite_reason = models.CharField(max_length=64)

class ManyToManyField

ManyToManyField.through

Django 會(huì)自動(dòng)創(chuàng)建一個(gè)表來管理多對(duì)多關(guān)系, 若要手動(dòng)指定關(guān)聯(lián)表則需要使用through關(guān)鍵字參數(shù).

ManyToManyField.through_fields

上文示例中Membership 有兩個(gè)外鍵指向Person (person 和inviter),這使得關(guān)聯(lián)關(guān)系含混不清并讓Django 不知道使用哪一個(gè)。

在這種情況下,必須使用through_fields 明確指定Django 應(yīng)該使用哪些外鍵

through_fields 接收一個(gè)二元組('field1', 'field2'),其中field1 為指向定義ManyToManyField 字段的模型的外鍵名稱(本例中為group),field2 為指向目標(biāo)模型的外鍵的名稱(本例中為person).

ManyToManyField.db_table

默認(rèn)情況下,關(guān)聯(lián)表的名稱使用多對(duì)多字段的名稱和包含這張表的模型的名稱以及Hash值生成,如:memberShip_person_3c1f5

若要想要手動(dòng)指定表的名稱,可以使用db_table關(guān)鍵字參數(shù)指定.

others

下列API和ForeignKey中的同名API相同.

  • ManyToManyField.db_constraint
  • ManyToManyField.related_name
  • ManyToManyField.related_query_name

使用ManyToManyField查詢

多對(duì)多關(guān)系和ForeignKey具有相似的API.

>>>e = Group.objects.get(id=3)
>>>e.members.all() # Returns all members objects for this Group.

反向查詢:

>>>a = Person.objects.get(id=1)
>>>a.group_set.all()

同樣related_name可以設(shè)置反向查詢集的名稱。

添加刪除關(guān)聯(lián)

因?yàn)镸anyToManyField自動(dòng)維護(hù)關(guān)聯(lián)表,程序員不便于直接訪問.ManyToManyField提供了API用于添加和刪除關(guān)聯(lián)(即through表中的記錄).

使用一個(gè)自動(dòng)維護(hù)through表的模型作為示例:

class User(models.Model):
  user_id = models.IntegerField(primary_key=True)
class Flight(models.Model):
  flight_id = models.IntegerField(primary_key=True)
  reserve = models.ManyToManyField(User, related_name='flight_reserve')

首先獲得要進(jìn)行關(guān)聯(lián)的Flight和User實(shí)例:

flights = Flight.objects.filter(flight_id=flight_id)
if flights.count() != 0:
  flight = flights[0]
users = User.objects.filter(id=user_id)
if users.count() != 0:
  user = users[0]

通過擁有關(guān)聯(lián)字段的Flight實(shí)例進(jìn)行添加關(guān)聯(lián)操作:

flight.reserve.add(user)
flight.save()

刪除操作與這類似:

flight.reserve.remove(user)
flight.save()

希望本文所述對(duì)大家基于Django框架的Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • python實(shí)現(xiàn)的一只從百度開始不斷搜索的小爬蟲

    python實(shí)現(xiàn)的一只從百度開始不斷搜索的小爬蟲

    這是我第三天學(xué)python了, 想寫一個(gè)東西紀(jì)念一下吧,于是寫了一直爬蟲,但是不是好的蟲,只能講網(wǎng)頁的關(guān)鍵詞存到本地, 但是我覺得基本上算是一只小蟲了
    2013-08-08
  • python實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲

    python實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 5個(gè)Python自動(dòng)化運(yùn)維腳本分享

    5個(gè)Python自動(dòng)化運(yùn)維腳本分享

    Python 是一種流行的編程語言,具有豐富的第三方庫和強(qiáng)大的自動(dòng)化能力,適用于許多不同的領(lǐng)域,許多運(yùn)維工程師會(huì)使用 Python 腳本來自動(dòng)化運(yùn)維任務(wù),所以本文為大家整理了5個(gè)Python自動(dòng)化運(yùn)維腳本,有需要的可以參考下
    2023-08-08
  • uwsgi啟動(dòng)django項(xiàng)目的實(shí)現(xiàn)步驟

    uwsgi啟動(dòng)django項(xiàng)目的實(shí)現(xiàn)步驟

    本文主要介紹了uwsgi啟動(dòng)django項(xiàng)目的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • python內(nèi)置函數(shù)之eval函數(shù)詳解

    python內(nèi)置函數(shù)之eval函數(shù)詳解

    這篇文章主要為大家介紹了python內(nèi)置函數(shù)之eval函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python簡(jiǎn)單實(shí)現(xiàn)Base64編碼和解碼的方法

    Python簡(jiǎn)單實(shí)現(xiàn)Base64編碼和解碼的方法

    這篇文章主要介紹了Python簡(jiǎn)單實(shí)現(xiàn)Base64編碼和解碼的方法,結(jié)合具體實(shí)例形式分析了Python實(shí)現(xiàn)base64編碼解碼相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下
    2017-04-04
  • python基礎(chǔ)操作列表切片解析

    python基礎(chǔ)操作列表切片解析

    列表和字符串一樣,列表同樣可以截取和被索引,列表被截取后返回一個(gè)包含所需元素的新列表,List中的元素是可以改變的,需要的朋友可以參考下
    2023-04-04
  • Python3標(biāo)準(zhǔn)庫之threading進(jìn)程中管理并發(fā)操作方法

    Python3標(biāo)準(zhǔn)庫之threading進(jìn)程中管理并發(fā)操作方法

    這篇文章主要介紹了Python3標(biāo)準(zhǔn)庫之threading進(jìn)程中管理并發(fā)操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python制作CSDN免積分下載器

    Python制作CSDN免積分下載器

    本文給大家分享的是使用python實(shí)現(xiàn)的CSDN的免積分下載器,具體干嘛的,我相信你懂的~~~有需要的小伙伴自己來看看哈。
    2015-03-03
  • Python日志logging模塊功能與用法詳解

    Python日志logging模塊功能與用法詳解

    這篇文章主要介紹了Python日志logging模塊功能與用法,結(jié)合實(shí)例形式詳細(xì)分析了Python日志logging模塊的基本功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04

最新評(píng)論

仙游县| 枞阳县| 潍坊市| 巴南区| 平顺县| 米脂县| 二连浩特市| 杭锦旗| 义马市| 唐河县| 叙永县| 堆龙德庆县| 长治市| 新宾| 万载县| 汉川市| 修文县| 沙坪坝区| 巧家县| 康定县| 衡南县| 石阡县| 郓城县| 东乡族自治县| 惠安县| 葵青区| 农安县| 云南省| 庆元县| 伊吾县| 宣化县| 保靖县| 井陉县| 耿马| 游戏| 双峰县| 怀宁县| 呈贡县| 松江区| 怀来县| 上杭县|