其他分享
首页 > 其他分享> > 基于对象的跨表查询 -- 类似于子查询

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

作者:互联网

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

正向查询和反向查询

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

#查询
    # 一对一
        # 正向查询
        #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}

标签:__,obj,name,author,--,查询,跨表,book,print
来源: https://www.cnblogs.com/wyh0717/p/13749079.html