zoukankan      html  css  js  c++  java
  • 基于对象的跨表查询 -- 类似于子查询

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

    正向查询和反向查询

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

    #查询
        # 一对一
            # 正向查询
            #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}
    
    
  • 相关阅读:
    解决configure: error: C preprocessor "/lib/cpp" fails sanity check
    centos7.3(1611) 64位 离线安装gcc
    spring-boot 启动时候 出现异常:The bean 'xxx' could not be injected as a 'xx.xxxx' because it is a JDK dynami
    springboot 关于 Class path contains multiple SLF4J bindings.警告的解决
    统计学习方法笔记---1203、统计学习方法总结(3.学习策略、4.学习算法)
    统计学习方法笔记---1202、统计学习方法总结(1.适用问题、2.模型)
    统计学习方法笔记---1201、统计学习方法总结
    统计学习方法笔记---0、读大纲
    心得体悟帖---201204(consciousness)
    心得体悟帖---201204(interest)
  • 原文地址:https://www.cnblogs.com/wyh0717/p/13749079.html
Copyright © 2011-2022 走看看