• 基于对象的跨表查询 -- 类似于子查询


    基于对象的跨表查询 -- 类似于子查询

    正向查询和反向查询

    关系属性(字段)写在哪个类(表)里面,从当前类(表)的数据去查询它关联类(表)的数据叫做正向查询,反之叫做反向查询

    #查询
        # 一对一
            # 正向查询
            #1 查询崔老师的电话号
        # author_obj = models.Author.objects.filter(name='崔老师').first()
        # # print(author_obj.authorDetail) #辽宁峨眉山
        # # print(author_obj.authorDetail.telephone) #444
        #     #2 反向查询
        #     #2 查询一下这个444电话号是谁的.
        # author_detail_obj = models.AuthorDetail.objects.get(telephone='444')
        # print(author_detail_obj.author) #崔老师
        # print(author_detail_obj.author.name) #崔老师
    
    
        '''        正向查询:Authorobj.authorDetail,对象.关联属性名称
            Author----------------------------------->AuthorDetail
                  <-----------------------------------
                  反向查询:AuthorDetailobj.author  ,对象.小写类名
        '''
    
        # 一对多
        # 查询一下李帅的床头故事这本书的出版社是哪个
        # 正向查询
        book_obj = models.Book.objects.get(title='李帅的床头故事')
        print(book_obj.publishs) #B哥出版社
        print(book_obj.publishs.name) #B哥出版社
    
        # B哥出版社出版社出版了哪些书
        # 反向查询
        pub_obj = models.Publish.objects.get(name='B哥出版社')
        print(pub_obj.book_set.all()) #<QuerySet [<Book: 李帅的床头故事>, <Book: 李帅的床头故事2>]>
    
        '''   正向查询 book_obj.publishs  对象.属性
        Book ---------------------------------------------> Publish
            <----------------------------------------------
              反向查询 publish_obj.book_set.all()  对象.表名小写_set
        '''
    
        # 多对多
        # 李帅的床头故事这本书是谁写的
        # 正向查询
        book_obj = models.Book.objects.get(title='李帅的床头故事')
        print(book_obj.authors.all())
        # 高杰写了哪些书
        author_obj = models.Author.objects.get(name='高杰')
        print(author_obj.book_set.all())
    
        '''       正向查询 book_obj.authors.all()  对象.属性
            Book ---------------------------------------------> Author
                <----------------------------------------------
                  反向查询 author_obj.book_set.all()  对象.表名小写_set
        '''
    
    
    
    
    

    基于双下划綫的跨表查询 -- 连表 join

    正向查询和反向查询

    #查询
        # 一对一
        # 1. 查询崔老师的电话号
        # 方式1  正向查询
        # obj = models.Author.objects.filter(name='崔老师').values('authorDetail__telephone')
        # print(obj) #<QuerySet [{'authorDetail__telephone': '444'}]>
        # 方式2  反向查询
        # obj = models.AuthorDetail.objects.filter(author__name='崔老师').values('telephone','author__age')
        # print(obj) #<QuerySet [{'telephone': '444'}]>
        # 2. 哪个老师的电话是444
        # 正向
        # obj = models.Author.objects.filter(authorDetail__telephone='444').values('name')
        # print(obj)
        # 反向
        # obj = models.AuthorDetail.objects.filter(telephone='444').values('author__name')
        # print(obj)
    
        # 一对多
        # 查询一下李帅的床头故事这本书的出版社是哪个
        # obj = models.Book.objects.filter(title='李帅的床头故事').values('publishs__name')
        # print(obj) #<QuerySet [{'publishs__name': 'B哥出版社'}]>
    
        # obj = models.Publish.objects.filter(book__title='李帅的床头故事').values('name')
        # obj = models.Publish.objects.filter(xx__title='李帅的床头故事').values('name')
        # print(obj)
    
        # B哥出版社出版社出版了哪些书
        # obj = models.Publish.objects.filter(name='B哥出版社').values('book__title')
        # print(obj) #<QuerySet [{'book__title': '李帅的床头故事'}, {'book__title': '李帅的床头故事2'}]>
    
        # obj = models.Book.objects.filter(publishs__name='B哥出版社').values('title')
        # print(obj) #<QuerySet [{'title': '李帅的床头故事'}, {'title': '李帅的床头故事2'}]>
    
        # 李帅的床头故事这本书是谁写的
        # obj = models.Book.objects.filter(title='李帅的床头故事').values('authors__name')
        # print(obj)
        # obj = models.Author.objects.filter(book__title='李帅的床头故事').values('name')
        # print(obj) #<QuerySet [{'name': '高杰'}, {'name': '崔老师'}]>
    
        #高杰写了哪些书
        # obj = models.Book.objects.filter(authors__name='高杰').values('title')
        # print(obj)
        # obj = models.Author.objects.filter(name='高杰').values('book__title')
        # print(obj)
    
        #进阶的
        # B哥出版社 出版的书的名称以及作者的名字
        # obj = models.Book.objects.filter(publishs__name='B哥出版社').values('title','authors__name')
        # print(obj)
        #<QuerySet [{'title': '李帅的床头故事', 'authors__name': '高杰'}, {'title': '李帅的床头故事', 'authors__name': '崔老师'}, {'title': '李帅的床头故事2', 'authors__name': '崔老师'}, {'title': '李帅的床头故事2', 'authors__name': '王涛'}]>
        '''
        SELECT app01_book.title,app01_author.name from app01_publish INNER JOIN app01_book on app01_publish.id=app01_book.publishs_id
    	INNER JOIN app01_book_authors on app01_book.nid = app01_book_authors.book_id  INNER JOIN app01_author
    		ON app01_author.id = app01_book_authors.author_id where app01_publish.name='B哥出版社';
        :param request:
        :return:
        '''
    
        # obj = models.Publish.objects.filter(name='B哥出版社').values('book__title','book__authors__name')
        # print(obj)
    
        # obj = models.Author.objects.filter(book__publishs__name='B哥出版社').values('name','book__title')
        # print(obj)
    
        # authorDetail author book publish
        # 手机号以4开头的作者出版过的所有书籍名称以及出版社名称
        # ret = models.AuthorDetail.objects.filter(telephone__startswith='4').values('author__book__title','author__book__publishs__name')
        # print(ret)
        #QuerySet [{'author__book__title': '李帅的床头故事', 'author__book__publishs__name': 'B哥出版社'}, {'author__book__title': '李帅的床头故事2', 'author__book__publishs__name': 'B哥出版社'}]>
    
    
        #查询一下B哥出版社出版了哪些书
        # obj = models.Publish.objects.filter(name='B哥出版社').first()
        # print(obj.xx.all())
    

    聚合

        from django.db.models import Avg,Max,Min,Sum,Count
    
        # 计算所有图书的平均价格
        # obj = models.Book.objects.all().aggregate(a=Avg('price'),m=Max('price')) #aggregate()是QuerySet 的一个终止子句,得到的是个字典.
        # print(obj['m'] - 2) #{'price__avg': 2.833333}
    
    
  • 相关阅读:
    条件注释判断IE版本
    win7及以上系统打开chm空白或显示"无法打开"的2个解决方案
    复制和删除txt文件
    casperjs 抓取爱奇艺高清视频
    chrome扩展程序之http/https 报文拦截
    bootstrap 的 datetimepicker 结束时间大于开始时间
    Jquery EasyUI的datagrid页脚footer使用及数据统计
    Web应用程序在加入反向代理服务器的时候如何获得真实IP
    c#4.0 新特性 可选参数 可曾用过?
    Pyhon
  • 原文地址:https://www.cnblogs.com/wyh0717/p/13749079.html
Copyright © 2020-2023  润新知