zoukankan      html  css  js  c++  java
  • Django--ORM多对多表操作

    创建用于演示的数据表

    models.py:
                            class Boy(models.Model):
                                name = models.CharField(max_length=32, null=True)
    
                            class Girl(models.Model):
                                nick = models.CharField(max_length=32, null=True)
    
                            class Love(models.Model):
                                b = models.ForeignKey("Boy", null=True)
                                g = models.ForeignKey("Girl", null=True)

    查询boy表中的某个男孩对应的女孩

    方法一

    # res = models.Boy.objects.filter(name='boy1').first()
    # # print(res) 
    ### Boy object
    # ### 反向查询 love中的记录 # love_list = res.love_set.all()
    ## <QuerySet [<Love: Love object>, <Love: Love object>]>
    # for obj in love_list: # ### 正向查询 girl表中的nick # print(obj.g.nick)

    方法二

    # res = models.Love.objects.filter(b__name='勾洋').all()
    # print(res) ## <QuerySet [<Love: Love object>, <Love: Love object>]>
    # for obj in res:
    #     print(obj.g.nick)

    方法三

    res = models.Love.objects.filter(b__name='勾洋').values("g__nick")
    print(res)

    以上的方法是基于我们自己创建的第三张多对多表来讲两个表关联起来来实现正查反查

    而在django中我们可以通过 ManyToManyField() 来生成第三张表

    在models.py下
    class Boy(models.Model):
      name = models.CharField(max_length=32, null=True)
      g = models.ManyToManyField('Girl', null=True)
    
    class Girl(models.Model):
      nick = models.CharField(max_length=32, null=True)

    增加

    obj = models.Boy.objects.filter(name='boy1').first()
    print(obj)
    #==>Boy object
    obj.g.add(3) obj.g.add(*[1,2])       在关联表中增加两条数据

    重置

    obj = models.Boy.objects.filter(name='boy1').first()
    obj.g.set([4])  清空关联表中所有obj相关的数据然后重新写入列表中的数据

    查询

    obj = models.Boy.objects.filter(name='boy1').first()
    res = obj.g.all()
    print(res)
    #==》<QuerySet [<Girl: Girl object>, <Girl: Girl object>, <Girl: Girl object>]>
    for obj in res: print(obj.nick)

    删除  

    obj = models.Boy.objects.filter(name='boy1').first()
    obj.g.clear()
  • 相关阅读:
    Mooncake (排序+贪心)
    The Black Hole of Numbers (strtoint+inttostr+sort)
    随机排序
    EF 随机排序
    禁用DropDownList的Items
    sql之left join、right join、inner join的区别
    SQL优化-索引
    .net 面试问题 汇总
    从简单的例子理解泛型
    1.1 使用内置的Camera应用程序捕获图像
  • 原文地址:https://www.cnblogs.com/duGD/p/11203870.html
Copyright © 2011-2022 走看看