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')
models

方法一: 正反向操作

obj =Models.Boy.objects.filter(name='alex').first()

love_list = obj.love_set.all()  #反向

for row in love_list:

  print(row.g.nick)
Views

方法二:连表操作

#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)

#跨表拿到
Views

方法三:取到字典,不连表

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是联合唯一索引。业务约束
models.py

另外一种简单方法: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)  
models.py
原文地址:https://www.cnblogs.com/catherine007/p/8920222.html