• Django-多对多跨表查询


    多对多跨表查询

    男生表:id、姓名

    女生表:id、姓名

    相亲记录表:id、男生id、女生id

    第一种:数据准备

    class Boy(models.Model):
        bname = models.CharField(max_length=32,null=True)
    
    class Girl(models.Model):
        gname = models.CharField(max_length=32,null=True)
    
    class Boy2Girl(models.Model):
        b = models.ForeignKey('Boy')  # 外键关联Boy表中的id
        g = models.ForeignKey('Girl')  # 外键关联Girl表中的id
    
        class Meta:
            # 建立联合唯一索引
            unique_together = [
                ('b','g')
            ]
    
    # 添加数据 
    boys = [
            models.Boy(bname='aaa'),
            models.Boy(bname='bbb'),
            models.Boy(bname='ccc'),
            models.Boy(bname='ddd'),
        ]
    girls = [
        models.Girl(gname='张三'),
        models.Girl(gname='李四'),
        models.Girl(gname='王二'),
        models.Girl(gname='小六'),
        ]
    b2g = [
        models.Boy2Girl(b_id=1,g_id=2),
        models.Boy2Girl(b_id=1,g_id=3),
        models.Boy2Girl(b_id=1,g_id=4),
        models.Boy2Girl(b_id=2,g_id=1),
        models.Boy2Girl(b_id=1,g_id=1),
        models.Boy2Girl(b_id=3,g_id=2),
        models.Boy2Girl(b_id=4,g_id=3),
        ]
    models.Boy.objects.bulk_create(boys)
    models.Girl.objects.bulk_create(girls)
    models.Boy2Girl.objects.bulk_create(b2g)
    

    查询数据

    # 查询boy名字为aaa的相亲对象名字
    # 方式一
    res = models.Boy.objects.filter(bname='aaa').first()
    love_list = res.boy2girl_set.all()
    for item in love_list:
        print(item.g.gname)
        
    # 方式二
    res = models.Boy2Girl.objects.filter(b__bname='aaa').all()
    for love in res:
        print(love.g.gname)
        
    # 方式三
    res = models.Boy2Girl.objects.values('g__gname').filter(b__bname='aaa')
    print(res)
    

    第二种:数据准备

    class Boy(models.Model):
        bname = models.CharField(max_length=32,null=True)
        g = models.ManyToManyField('Girl',null=True,related_name='xxx')  # 建立关系表,related_name作用:在反向查询时可以用来代替‘小写类名_set’
    
    class Girl(models.Model):
        gname = models.CharField(max_length=32,null=True)
    
    # 添加数据 
    boys = [
            models.Boy(bname='aaa'),
            models.Boy(bname='bbb'),
            models.Boy(bname='ccc'),
            models.Boy(bname='ddd'),
        ]
    girls = [
        models.Girl(gname='张三'),
        models.Girl(gname='李四'),
        models.Girl(gname='王二'),
        models.Girl(gname='小六'),
        ]
    models.Boy.objects.bulk_create(boys)
    models.Girl.objects.bulk_create(girls)
    
    # 给boy表的aaa添加相亲对象1,2,3
    res =models.Boy.objects.filter(bname='aaa').first()
    res.g.add(1)
    res.g.add(2,3)
    
    # 给boy表的aaa删除相亲对象3
    res =models.Boy.objects.filter(bname='aaa').first()
    res.g.remove(1)
    
    # 删除boy表的aaa的所有相亲对象
    res =models.Boy.objects.filter(bname='aaa').first()
    res.g.clear()
    
    # 重设置boy表的aaa的所有相亲对象
    res =models.Boy.objects.filter(bname='aaa').first()
    res.g.set([2,3])
    
    # 查询boy表的aaa的相亲对象
    res =models.Boy.objects.filter(bname='aaa').first()
    res.g.all()  # 返回的是一个列表里套对象
    
    # 给Girl表的小六添加相亲对象1,2,3,4
    res = models.Girl.objects.filter(name='小六').first()
    res.boy_set.add(1,2,3,4)  # 或者res.xxx.add(1,2,3,4)
    
    # 给Girl表的小六删除相亲对象1
    res = models.Girl.objects.filter(name='小六').first()
    res.boy_set.remove(1)  # 或者res.xxx.remove(1)
    
    # 查询Girl表的小六的相亲对象
    res = models.Girl.objects.filter(name='小六').first()
    res.boy_set.all()  #  # 或者res.xxx.all(),返回的是一个列表里套对象
    
    
  • 相关阅读:
    笑话几则
    .net 知识点滴
    LoadRunner本机录制http协议程序遇到的问题以及解决方法
    40款非常棒的 jQuery 插件和制作教程(系列二)
    50个极佳的企业网站案例
    jQuery ui effects
    9个优秀网上免费标签云生成工具
    30 +创意的登录页面设计灵感
    分享一个jQuery的时间轴插件:TimergliderJS
    36个非常有趣的互动网站设计作品范例
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11360703.html
Copyright © 2020-2023  润新知