zoukankan      html  css  js  c++  java
  • $Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)

    自定义第三张表的好处:可以定义多个字段,

                                 缺点:查询不方便(有方法解决)

    1.第三张表设置外键,联合唯一(查询不方便)

    class Books(models.Model):
    name=models.CharField(max_length=32)
    price=models.DecimalField(max_digits=6,decimal_places=2)
    class Zuozhes(models.Model):
    name=models.CharField(max_length=32)
    sex=models.BooleanField()
    # 第三张表
    class b_z(models.Model):
    book=models.ForeignKey(to='Books',to_field='id')
    zuozhe=models.ForeignKey(to='Zuozhes',to_field='id')
    class Meta:
    unique_together=('book','zuozhe')
    import os
    if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dj23.settings")
    import django
    django.setup()

    from app01.models import *
    # 添加书,作者,关联
    a1=Books.objects.create(name='西游记2',price=30)
    print(a1) #object
    b1=Zuozhes.objects.create(name='lqz2',sex=True)
    b2=Zuozhes.objects.create(name='egon2',sex=True)
    b_z.objects.create(book=a1,zuozhe=b1)
    b_z.objects.create(book=a1,zuozhe=b2)
    # 跨表查询
    # 查询书名为西游记的 作者名
    b=Books.objects.filter(name='西游记')
    b=[ i for i in b]
    z=b_z.objects.filter(book__in=b)
    z=[i.zuozhe_id for i in z]
    g=Zuozhes.objects.filter(id__in=z).values('name')
    print(g) #<QuerySet [{'name': 'lqz'}, {'name': 'egon'}]>
    # 查询查询书名为西游记2的 作者名
    u=Books.objects.filter(name='西游记2')
    u=[i for i in u]
    c=b_z.objects.filter(book__in=u).values('zuozhe__name')
    print(c) #<QuerySet [{'zuozhe__name': 'lqz2'}, {'zuozhe__name':}]>

    2.第三张表设置外键,联合唯一(查询方便)
    class Books(models.Model):
    name=models.CharField(max_length=32)
    price=models.DecimalField(max_digits=6,decimal_places=2)
    zuo=models.ManyToManyField(to='Zuozhes',through='b_z',through_fields=('book','zuozhe'))
    # 关联字段就是表名小写, 第一个值: 就是当前表的表名小写,顺序很重要
    class Zuozhes(models.Model):
    name=models.CharField(max_length=32)
    sex=models.BooleanField()
    # 第三张表
    class b_z(models.Model):
    book=models.ForeignKey(to='Books',to_field='id')
    zuozhe=models.ForeignKey(to='Zuozhes',to_field='id')
    class Meta:
    unique_together=('book','zuozhe')

    from app02 import models as m
    # 添加书,作者,关联
    n1=m.Books.objects.create(name='校花贴身高手',price=66)
    n2=m.Books.objects.create(name='蛮荒',price=60)
    v1=m.Zuozhes.objects.create(name='零一',sex=True)
    v2=m.Zuozhes.objects.create(name='娥',sex=True)
    v3=m.Zuozhes.objects.create(name='牧尘',sex=True)
    v4=m.Zuozhes.objects.create(name='额',sex=True)
    m.b_z.objects.create(book=n1,zuozhe=v1)
    m.b_z.objects.create(book=n1,zuozhe=v2)
    m.b_z.objects.create(book=n2,zuozhe=v3)
    m.b_z.objects.create(book=n2,zuozhe=v4)
    # 查询查询书名为校花贴身高手的作者名
    b1=m.Books.objects.filter(name='校花贴身高手').values('zuo__name')
    print(b1) #<QuerySet [{'zuo__name': '零一'}, {'zuo__name': '娥'}]>
    b2=m.Books.objects.filter (name='校花贴身高手')
    b2=[i.zuo for i in b2]
    for i in b2:
    print(i) #app02.Zuozhes.None
    for z in i.all():
    print(z.name) #零一 娥
    # 查询查询书名为蛮荒的作者名
    p=m.Zuozhes.objects.filter(books__name='蛮荒').values('name')
    print(p) #<QuerySet [{'name': '牧尘'}, {'name': '额'}]>
    基于双下划线跨表查询精髓:正向:book表查作者 内有zuozhe外键字段(按字段 查)  Book.object.filter(zuozhe__name='xxx')
                 反向:zuozhe表查书 (按表名小写 查) Zuozhe.object.filter(book__name__in=['ooo','yyy'])

  • 相关阅读:
    winform控件库二次开发yy
    Oracle数据库表死锁和解锁
    集合去重筛选
    linux手动生成core dump
    HandlerSocket简介以及php使用handlersocket
    使用truss、strace或ltrace诊断软件的“疑难杂症”
    Sqlserver 2012 导出表数据为SQL脚本
    MySQL的索引为什么使用B+Tree
    计算机体系
    docker使用
  • 原文地址:https://www.cnblogs.com/3sss-ss-s/p/9984686.html
Copyright © 2011-2022 走看看