• (20)模型层 -ORM之msql 基于双下划线的跨表查询(一对一,一对多,多对多)


    基于对象的跨表查询是子查询

    基于双下划线的查询是连表查询

    PS:基于双下划线的跨表查询 正向按字段,反向按表名小写

    一对一

    需求:查询lqz这个人的地址
    # 正向查询
    ret = models.Author.objects.filter(name='lqa').values('author_detail__addr') #Author表作为基表,然后从基表中查到人名,然后从Authonr表跨到author_detail表中获取name对应的addr字段
    ret = models.Author.objects.filter(name='lqa').values('name','author_detail__addr') # values里面第一个name的位置可以写基表里面的字段,这样就可以同时打印出查询的内容,比如名字在基表中,地址在另一张表,这样一次可以查出名字和地址

    # 反向查询
    ret = models.AuthorDetail.objects.filter(author__name='lqz').values('addr','author__name') #基表中没有lqz字段,author__name这样写就等于来到了author, __name就是去author表中的name这个字段对应的值,values后面因为基表中没有name,所以需要author__name,进入author表中获取name字段

    需求:查询地址为武汉的人的名字
    # 正向查询
    ret=models.Author.objects.filter(author_detail__addr='武汉').values('name','author_detail__addr')
    # 反向查询
    ret = models.AuthorDetail.objects.filter(addr='武汉').values('author__name','addr') #addr在基表中,所以直接写要查询的字段即可,值由于基表中没有name字段,要去关联表查询,这就是反向所以要用表名小写加__字段,如果基表中有的则直接写addr即可

    一对多

    需求:查询红楼梦这本书的出版社
    # 正向查询
    ret = models.Book.objects.filter(name='红楼梦').values('publish__addr')
    # 反向查询
    ret = models.Publish.objects.filter(book__name='红楼梦').values('addr')

    需求:查询南京出版社出版的所有书的名字
    # 正向 查询
    ret=models.Publish.objects.filter(name='南京出版社').values('book__name')
    # 反向查询
    ret=models.Book.objects.filter(publish__name='南京出版社').values('name')

    多对多

    需求:查询红楼这本书的所有作者
    # 正向查询
    ret = models.Book.objects.filter(name='红楼梦').values('author__name')
    # 反向查询
    ret = models.Author.objects.filter(Book__name='红楼梦').values('name')

    # 跨多表
    需求查询南京出版社出版过的所有书籍的名字以及作者的姓名
    ret=models.Publish.objects.filter(name='南京出版社').values('book__name','book__authors__name') #由于作者的姓名在author表中,基表和author表中间还有一张book表,所以在values里面第二个位置写book__authors__name就相当于已经来到了book然后对author表做了跨表查询
  • 相关阅读:
    http请求的GET和POST请求:查询和新增(server.php)
    http请求的GET和POST请求:查询和新增(ajax)
    shell中$(( )) 与 $( ) 还有${ }的区别
    linux查看操作系统版本信息
    Linux useradd 与 adduser的区别, /sbin/nologin 与 /bin/bash
    红帽触摸屏屏幕180旋转
    Sed命令n,N,d,D,p,P,h,H,g,G,x解析3
    sed命令
    sed高级用法:模式空间(pattern space)和保持空间(hold space)
    sed的模式空间和保持空间
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10528438.html
Copyright © 2020-2023  润新知