zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    配置Keepalived双主热备
    配置 Keepalived
    Keepalived安装部署
    Keepalived配置Nginx自动重启
    Collectiont和Collections的区别
    HashMap和Hashtable的联系和区别
    Vector和ArrayList的联系和区别
    ArrayList和LinkedList 的联系和区别
    集合和数组的比较
    struts下载
  • 原文地址:https://www.cnblogs.com/catherine007/p/8920222.html
Copyright © 2011-2022 走看看