Django-多對多跨表查詢


多對多跨表查詢

男生表:id、姓名

女生表:id、姓名

相親記錄表:id、男生id、女生id

第一種:數據准備

class Boy(models.Model):
    bname = models.CharField(max_length=32,null=True)

class Girl(models.Model):
    gname = models.CharField(max_length=32,null=True)

class Boy2Girl(models.Model):
    b = models.ForeignKey('Boy')  # 外鍵關聯Boy表中的id
    g = models.ForeignKey('Girl')  # 外鍵關聯Girl表中的id

    class Meta:
        # 建立聯合唯一索引
        unique_together = [
            ('b','g')
        ]

# 添加數據 
boys = [
        models.Boy(bname='aaa'),
        models.Boy(bname='bbb'),
        models.Boy(bname='ccc'),
        models.Boy(bname='ddd'),
    ]
girls = [
    models.Girl(gname='張三'),
    models.Girl(gname='李四'),
    models.Girl(gname='王二'),
    models.Girl(gname='小六'),
    ]
b2g = [
    models.Boy2Girl(b_id=1,g_id=2),
    models.Boy2Girl(b_id=1,g_id=3),
    models.Boy2Girl(b_id=1,g_id=4),
    models.Boy2Girl(b_id=2,g_id=1),
    models.Boy2Girl(b_id=1,g_id=1),
    models.Boy2Girl(b_id=3,g_id=2),
    models.Boy2Girl(b_id=4,g_id=3),
    ]
models.Boy.objects.bulk_create(boys)
models.Girl.objects.bulk_create(girls)
models.Boy2Girl.objects.bulk_create(b2g)

查詢數據

# 查詢boy名字為aaa的相親對象名字
# 方式一
res = models.Boy.objects.filter(bname='aaa').first()
love_list = res.boy2girl_set.all()
for item in love_list:
    print(item.g.gname)
    
# 方式二
res = models.Boy2Girl.objects.filter(b__bname='aaa').all()
for love in res:
    print(love.g.gname)
    
# 方式三
res = models.Boy2Girl.objects.values('g__gname').filter(b__bname='aaa')
print(res)

第二種:數據准備

class Boy(models.Model):
    bname = models.CharField(max_length=32,null=True)
    g = models.ManyToManyField('Girl',null=True,related_name='xxx')  # 建立關系表,related_name作用:在反向查詢時可以用來代替‘小寫類名_set’

class Girl(models.Model):
    gname = models.CharField(max_length=32,null=True)

# 添加數據 
boys = [
        models.Boy(bname='aaa'),
        models.Boy(bname='bbb'),
        models.Boy(bname='ccc'),
        models.Boy(bname='ddd'),
    ]
girls = [
    models.Girl(gname='張三'),
    models.Girl(gname='李四'),
    models.Girl(gname='王二'),
    models.Girl(gname='小六'),
    ]
models.Boy.objects.bulk_create(boys)
models.Girl.objects.bulk_create(girls)

# 給boy表的aaa添加相親對象1,2,3
res =models.Boy.objects.filter(bname='aaa').first()
res.g.add(1)
res.g.add(2,3)

# 給boy表的aaa刪除相親對象3
res =models.Boy.objects.filter(bname='aaa').first()
res.g.remove(1)

# 刪除boy表的aaa的所有相親對象
res =models.Boy.objects.filter(bname='aaa').first()
res.g.clear()

# 重設置boy表的aaa的所有相親對象
res =models.Boy.objects.filter(bname='aaa').first()
res.g.set([2,3])

# 查詢boy表的aaa的相親對象
res =models.Boy.objects.filter(bname='aaa').first()
res.g.all()  # 返回的是一個列表里套對象

# 給Girl表的小六添加相親對象1,2,3,4
res = models.Girl.objects.filter(name='小六').first()
res.boy_set.add(1,2,3,4)  # 或者res.xxx.add(1,2,3,4)

# 給Girl表的小六刪除相親對象1
res = models.Girl.objects.filter(name='小六').first()
res.boy_set.remove(1)  # 或者res.xxx.remove(1)

# 查詢Girl表的小六的相親對象
res = models.Girl.objects.filter(name='小六').first()
res.boy_set.all()  #  # 或者res.xxx.all(),返回的是一個列表里套對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM