联表查询(基于双下划线的跨表查询)

# 查询出版社所有的书籍名字和出版社的名字
    #出版社查书 反向 多个
    # res = models.Publish.objects.filter(name='东方出版社').values('name','book__title')
    # print(res)
    # 所有书查出版社 正向 一个
    # res = models.Book.objects.filter().values('title','publish__name')
    # print(res)
    # 查书id为1的 出版社 正向 一个
    # res = models.Book.objects.filter(pk=1).values('title','publish__name')
    # print(res)

# 查询书籍主键是1的作者的手机号
    #正向  书籍查作者
    # res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone')
    # print(res)
    #反向 作者查收书籍
    # res = models.Author.objects.filter(book__id=1).values('author_detail__phone','book__title')
    # print(res)

#查询辰东的书籍 和手机号
    #正向
    # res = models.Book.objects.filter(authors__name='辰东').values('title','authors__author_detail__phone')
    # print(res)
    #反向
    # res = models.Author.objects.filter(name='辰东').values('book__title','author_detail__phone')
    # print(res)

    # 查询辰东和唐家三少的书籍 和手机号
    #正向
    # res = models.Book.objects.filter(authors__name__in=['辰东','唐家三少']).values('title','authors__author_detail__phone')
    # print(res)
    #反向
    # res = models.Author.objects.filter(name__in=['辰东','唐家三少']).values('book__title','author_detail__phone')
    # print(res)
    #通过手机号来查询书籍 和作者的名字
    #反向
    # res = models.AuthorDetail.objects.filter(phone=111).values('author__name','author__book__title')
    # print(res)

    #通过书籍找到作者和作者的详请
    # res = models.Book.objects.filter(pk=1).values('authors__name','authors__author_detail__phone','authors__author_detail__addr')
    # print(res)
    #通过出版社找到书,作者,作者详情
    #出版社查书 反向
    # res = models.Publish.objects.filter(name='东方出版社').values('book__title','book__authors__name','book__authors__author_detail__addr')
    # print(res)
    #正向 书查出版社

    # 1.查询书籍主键为1的出版社
    # book_obj = models.Book.objects.filter(pk=1).first()
    # # 书查出版社 正向
    # res = book_obj.publish
    # print(res)
    # print(res.name)
    # print(res.addr)
    res = models.Book.objects.filter(title='遮天').first()  #是列表套的形式,必须得这样取
    book_title = res.title
    publish_name = res.publish.name
    aothor_name = res.authors.all().first().name

    print(book_title,publish_name,aothor_name)

    '''
    select * from app01_book where app01_book.id in 
    (select book_id from app01_book_authors  where app01_book_authors.author_id=
    (select id from app01_author where app01_author.id = 
    (select id from app01_authordetail where app01_authordetail.phone=111)))

    
    slect * from "app01_authordetail" 
    inner join "app01_author" on ("app01_authordetail"."id" = "app01_author"."author_detail_id") 
    inner join "app01_book_authors" on ("app01_author"."id" = "app01_book_authors"."author_id") 
    inner join "app01_book" on ("app01_book_authors"."book_id" = "app01_book"."id") where "app01_authordetail"."phone" = 111

    '''


    '''
    这里就不需要在写all了,查到的数据都会显示出来
    正向查询和反向查询还是根据外键字段在谁那里来判断
    filter的过滤条件:通过什么查什么就过滤谁  通过出版社 找作者,作者的书,作者的详情  filter的就是出版社
        跨表操作直接__就可以跨到关联过字段的表上,然后就可以直接__name取字段
        哪怕是出版社只关联了作者,也还是可以通过作者__书找到书,他们之间有一条关联的线就可以随意跨
    '''

  

posted @ 2022-04-04 22:33  咖喱给给啊  阅读(27)  评论(0)    收藏  举报