Django-ORM多對多查詢 (自定義第三張表&ManyToManyField)

對于多對多表

  • 1.自定義第三張表蜂怎,更加靈活

  • 2.ManyToManyField 自動生成第3張表 只能 有3列數(shù)據(jù) 不能自己添加菇存。

  • 自定義第三張表

# models.py

class Boy(models.Model):
    name = models.CharField(max_length=32)

class Girl(models.Model):
    name = models.CharField(max_length=32)


class Love(models.Model):
    b = models.ForeignKey('Boy')
    g = models.ForeignKey('Girl')

    # 創(chuàng)建聯(lián)合唯一索引
    # class Meta:
    #     unique_together = [
    #         ('b','g'),
    #     ]




# views.py

def test(request):
    # objs = [
    #     models.Boy(name='summer'),
    #     models.Boy(name='spring'),
    #     models.Boy(name='autumn'),
    # ]
    # models.Boy.objects.bulk_create(objs,5)

    # objs = [
    #     models.Girl(name='小于'),
    #     models.Girl(name='小秋'),
    #     models.Girl(name='小夏'),
    # ]
    # models.Girl.objects.bulk_create(objs,5)

# 查詢和girl小于有關(guān)系的boy

# 1 通過girl表進(jìn)行反向查找
    obj = models.Girl.objects.filter(name='小于').first().love_set.all()
    # obj = models.Girl.objects.filter(name='小于').first().love_set.select_related('b').all()
    for i in obj:
        print(i.b.name)




    print(' '.center(60,'='))



# 2 通過Love表進(jìn)行查找

    obj = models.Love.objects.filter(g__name='小于').all()
    for i in obj:
        print(i.b.name)

    # 這樣進(jìn)行查詢性能不好,需要重新發(fā)sql請求在進(jìn)行查詢另外一張表中的數(shù)據(jù)

    boy_list = models.Love.objects.filter(g__name='小于').values('b__name')
    for i in boy_list:
        print(i['b__name'])

    # 這樣 進(jìn)行了 優(yōu)化 不會重復(fù)發(fā)送sql請求君编,查詢到的結(jié)果內(nèi)是字典

    boy_obj = models.Love.objects.filter(g__name='小于').select_related('b').all()
    for i in boy_obj:
        print(i.b.name)
    # select_related('ut') 相當(dāng) 于 inner join 先連成一張表再進(jìn)行查詢

    return HttpResponse('insert ok ....')
  • ManyToManyField
# models.py
from django.db import models

class Boy(models.Model):
    name = models.CharField(max_length=32)
    # m = models.ManyToManyField('Girl')

class Girl(models.Model):
    name = models.CharField(max_length=32)
    m = models.ManyToManyField('Boy')

# views.py

def test(request):
    # objs = [
    #     models.Boy(name='summer'),
    #     models.Boy(name='spring'),
    #     models.Boy(name='autumn'),
    # ]
    # models.Boy.objects.bulk_create(objs,5)

    # objs = [
    #     models.Girl(name='小于'),
    #     models.Girl(name='小秋'),
    #     models.Girl(name='小夏'),
    # ]
    # models.Girl.objects.bulk_create(objs,5)


    # ManyToManyField

    obj = models.Girl.objects.filter(name='小秋').first()

    # 增
    # obj.m.add(3)
    # obj.m.add(3,4)
    # obj.m.add(*[1,2])

    # 刪
    # obj.m.remove(3)
    # obj.m.remove(3,4)
    # obj.m.remove(*[1,2])

    # 改
    # obj.m.set([1,2,])

    # boy_obj = obj.m.all()
    # for row in boy_obj:
    #     print(row.id,row.name)
    # 清除
    # obj.m.clear()


    # 反向查 在沒有 ManyToManyField 字段的表中查
    obj = models.Boy.objects.filter(name='summer').first()
    girl_obj = obj.girl_set.all()
    # 增刪改查
    obj.girl_set.set([1,2,3])

    for row in girl_list:
        print(row.id,row.name)

    return HttpResponse('ok')
  • 雜交(自定義第三張表+ManyToManyField)
# modles.py
class Boy(models.Model):
    name = models.CharField(max_length=32)

class Girl(models.Model):
    name = models.CharField(max_length=32)
    m = models.ManyToManyField('Boy',through='Love',through_fields=('b','g')) # 只讓其生成3張表,如果不加后面產(chǎn)生生成4張表

class Love(models.Model):
    b = models.ForeignKey('Boy')
    g = models.ForeignKey('Girl')

# views.py
def test(request):
    obj = models.Girl.objects.filter(name='小于').first()
    # obj.m.add(1) # 不行
    # obj.m.remove(1) # 不行
    # obj.m.set([1,2]) # 不行
    # obj.m.clear() # 可以
    # obj.m.all() # 可以

    # 雜交的方法對獲取查詢方便點(diǎn),還添加了清空功能

    boy_obj = obj.m.all()

    for i in boy_obj:
        print(i.name)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驹饺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子横朋,更是在濱河造成了極大的恐慌,老刑警劉巖百拓,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琴锭,死亡現(xiàn)場離奇詭異,居然都是意外死亡耐版,警方通過查閱死者的電腦和手機(jī)祠够,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粪牲,“玉大人,你說我怎么就攤上這事止剖∠傺簦” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵穿香,是天一觀的道長亭引。 經(jīng)常有香客問我,道長皮获,這世上最難降的妖魔是什么焙蚓? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮洒宝,結(jié)果婚禮上购公,老公的妹妹穿的比我還像新娘。我一直安慰自己雁歌,他們只是感情好宏浩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靠瞎,像睡著了一般比庄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乏盐,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天佳窑,我揣著相機(jī)與錄音,去河邊找鬼父能。 笑死神凑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的法竞。 我是一名探鬼主播耙厚,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼强挫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了薛躬?” 一聲冷哼從身側(cè)響起俯渤,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎型宝,沒想到半個(gè)月后八匠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趴酣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年梨树,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岖寞。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抡四,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仗谆,到底是詐尸還是另有隱情指巡,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布隶垮,位于F島的核電站藻雪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏狸吞。R本人自食惡果不足惜勉耀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹋偏。 院中可真熱鬧便斥,春花似錦、人聲如沸暖侨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽字逗。三九已至京郑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葫掉,已是汗流浹背些举。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俭厚,地道東北人户魏。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叼丑。 傳聞我的和親對象是個(gè)殘疾皇子关翎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)鸠信,斷路器纵寝,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件星立、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,033評論 4 62
  • 2018年爽茴,這一年,劉詩雯27歲绰垂。退役后室奏,她有了新的男友。她不愛他劲装,但不排斥胧沫。 幼年時(shí)總以為任何事情,只要努力就能...
    杯酒慰風(fēng)塵L閱讀 1,388評論 5 5
  • 昨天早上媽打電話,問我回去嗎纺酸,說黃灣橋修了,要收費(fèi)址否,又說沒啥事餐蔬,爹還是那樣,吃飯很急很快佑附,大小便失禁不能自理...
    雪木912閱讀 157評論 0 0