多對多跨表查詢
男生表: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(),返回的是一個列表里套對象