多对多关系表例,
objs= [ models.Boy(name='alex'), models.Boy(name='apple'), models.Boy(name='cat'), models.Boy(name='haha'), models.Boy(name='hehe'), ] models.Boy.objects.bulk_create(objs,5) objss= [ models.Girl(nick='bingbing'), models.Girl(nick='andy'), models.Girl(nick='hoho'), models.Girl(nick='zhuozhuo'), ] models.Girl.objects.bulk_create(objss,4) ##### #创建关系 models.Love.objects.create(b_id=1,g_id=1) models.Love.objects.create(b_id=1,g_id=4) models.Love.objects.create(b_id=2,g_id=4) models.Love.objects.create(b_id=2,g_id=3) ### views
找到数据库中,alex有关系的girl

class Boy(models.Model): """ 男生 """ name= models.CharField(max_length=32) class Girl(models.Model): """ 女生 """ nick = models.CharField(max_length=16) class Love(models.Model): b= models.ForeignKey('Boy') g= models.ForeignKey('Girl')
方法一: 正反向操作

obj =Models.Boy.objects.filter(name='alex').first() love_list = obj.love_set.all() #反向 for row in love_list: print(row.g.nick)
方法二:连表操作

#Love.objects.filter(b__name='alex') #跨表拿到love对象 love_list = models.Love.objects.filter(b__name='alex') for row in love_list : print(row.g.nick) #跨表拿到
方法三:取到字典,不连表
love_list = models.Love.objects.filter(b__name='alex').values('g__nick') #取到字典,且没有连表 for item in love_list: print(item['g__nick'])
方法四:
love_list = models.Love.objects.filter(b__name='alex').select_ralated('g') #取到对象 for obj in love_list: print(obj.g.nick)
联合唯一索引

class Love(models.Model): b= models.ForegnKey('Boy') g= models.ForegnKey('Girl') class Meta: unique_together=[ ('b','g'), ] #列表内的b,g是联合唯一索引。业务约束
另外一种简单方法:Django
class Boy(models.Model): name = models.CharField(max_length=32) m = models.ManyToManyField(‘Girl’) class Girl(models.Model): nick = models.CharField(max_length=32) #m = models.ManyToManyField(‘Boy’) #任意一个位置 #ManyToManyField()不会生成任意列,而是新建一个表 #django帮助生成第三张表,但无法直接对第三张表进行操作
操作方法
obj=models.Boy.objects.filter(name='alex').first() print(obj.id, obj.name) #间接操作 #增 obj.m.add(3) obj.m.add(2,4) obj.m.ad(*[1,]) #删 obj.m.remove(1) obj.m.remove(2,3) obj.m.remove(*[4,]) #重置 obj.m.set([1,]) #获取,alex相关联的girl的所有对象 q = obj.m.all() ##queryset[Girl对象] print(q) ### ###简洁,一步到位,去到alex相关所有girl obj= models.Boy.objects.filter(name='alex').first() #girl_list = obj.m.all() girl_list = obj.m.filter(nick='hehe') #又做了一次筛选
print(girl_list)
###
obj.m.clear() #删掉跟alex相关联的
obj=models.Girl.objects.filter(nick='hehe').first() print(obj.id, obj.nick) v=obj.boy_set.all() print(v) ###quryset boy obj
#Django内置第三张表,只能生成3列。
#若想增加第4列,最好用自定义第三张表。
第一种方式与第二种方式结合,第三种

class Boy(models.Model): name=models.CharField(max_length=32) m = models.ManyToManyField('Girl',through='Love',through_fields= ('b','g',)) class Girl(models.Model): nick=models.CharField(max_length=32) class Love(models.Model): b= models.ForeignKey('Boy') g= models.ForeignKey('Girl') class Meta: unique_together = [ ('b','g'), ] ###加入ManyToManyField作用 obj=models.Boy.objects.filter(name='alex').first() 不能用 obj.m.add(1) obj.m.remove(1) obj.m.set() 可用清空和查询 obj.m.clear() v=obj.m.all() print(v)