model之多对多
多对多关系表例,
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)
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号