day 61 django 跨表查询

今日内容

查询

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

正向查询:关系字段写在那个表里面,通过这个表去查询另外一个表

反向查询:关系字段在另外一张表,通过这张表查询宁外一张表数据

 ###########################查询#########################
   一对一
   ########正向查询####################
   new_author = models.Author.objects.get(pk=3)
   print(new_author.name)
   print(new_author.authorDetail.id)
   print(new_author.authorDetail.birthday)
   print(new_author.authorDetail.addr)
   print(new_author.sex.name)

   #########反向查询#################
   new_author_detail = models.AuthorDetail.objects.get(addr='四川成都')
   print(new_author_detail.author)  #models对象点表名获取表的str方法
   print(new_author_detail.author.id)
   print(new_author_detail.author.name)
   print(new_author_detail.author.age)

   一对多
   ########正向查询####################
   new_book = models.Book.objects.get(name='狼的诱惑')
   print(new_book.publishs.name)  #上海出版社

   #########反向查询#################
   上海出版社 出版了那些书
   new_pubilc_book = models.Public.objects.get(name='上海出版社')
   print(new_pubilc_book.book_set.all())  #<QuerySet [<Book: 狼的诱惑>, <Book: 双色球>]>
   print(new_pubilc_book.book_set.all().values())
   <QuerySet [{'id': 2, 'name': '狼的诱惑', 'publishDate': datetime.date(2021, 3, 4), 'price': 1000.0, 'publishs_id': 2}, {'id': 3, 'name': '双色球', 'publishDate': datetime.date(2021, 3, 31), 'price': 1000000.0, 'publishs_id': 2}]>
   print(new_pubilc_book.book_set.all().values_list('name','price'))
   # < QuerySet[('狼的诱惑', 1000.0), ('双色球', 1000000.0)] >
   for i in new_pubilc_book.book_set.all():
       print(i)

   多对多
   ########正向查询####################
   查询 书籍名 办公室 是谁写的
   new_author = models.Book.objects.get(name='办公室')
   print(new_author.authors.all())  #<QuerySet [<Author: 小泽玛利亚>, <Author: 小泽玛利亚-2>]>
   print(new_author.authors.values())
   <QuerySet [{'id': 4, 'name': '小泽玛利亚', 'age': 28, 'sex_id': 2, 'authorDetail_id': 6}, {'id': 5, 'name': '小泽玛利亚-2', 'age': 28, 'sex_id': 2, 'authorDetail_id': 7}]>
   print(new_author.authors.values_list('name','age'))
   <QuerySet [('小泽玛利亚', 28), ('小泽玛利亚-2', 28)]>

   #########反向查询###################
   查询  作者  黄黄 写了那些书
   new_author_book = models.Author.objects.get(name='黄黄')
   print(new_author_book.book_set.all())   #<QuerySet [<Book: 双色球>, <Book: 办公室>]>

说明:

  • 一对多或者多对多

    • 反向查询通过关联的表名+set来 获取对应的对象,通过点方法获取对应的值

基于双下划线的跨表查询——连表 join

正向和反向查询

1、 一对一
 #
  # 正向查询
   #1、查询 晨晨 的地址
   new_author_addr = models.Author.objects.filter(name='晨晨').values('authorDetail__addr')
   print(new_author_addr)
  #反向查询  
   #查询 晨晨 的地址
   new_author_addr2 = models.AuthorDetail.objects.filter(author__name='晨晨').values('addr')
   print(new_author_addr2)
   
   
   #2、查询 地址为 中国北京 的作者名字
       #正向查询
   new_addr_name = models.Author.objects.filter(authorDetail__addr='中国北京').values('name')
   print(new_addr_name)  #<QuerySet [{'name': '黄黄'}]>
       #反向查询
   new_addr_name_reverse = models.AuthorDetail.objects.filter(addr='中国北京').values('author__name')
   print(new_addr_name_reverse)  #<QuerySet [{'author__name': '黄黄'}]>

   
2、 一对多
 #查询一下  书籍 狼的诱惑 的出版社有那些
   # 正向查询
 
   new_book_public = models.Book.objects.filter(name='狼的诱惑').values('publishs__name')
   print(new_book_public)  #<QuerySet [{'publishs__name': '上海出版社'}]>

   #反向查询
   new_book_public_reverse = models.Public.objects.filter(book__name='狼的诱惑').values('name')
   print(new_book_public_reverse) #<QuerySet [{'name': '上海出版社'}]>
   
#查询 出版社 上海出版社 出版了那些书
   #正向查询
   new_public_books = models.Book.objects.filter(publishs__name='上海出版社').values('name')
   print(new_public_books)  #<QuerySet [{'name': '狼的诱惑'}, {'name': '双色球'}]>
   #反向查询
   new_public_books_reverse = models.Public.objects.filter(name='上海出版社').values('book__name')
   print(new_public_books_reverse) #<QuerySet [{'book__name': '狼的诱惑'}, {'book__name': '双色球'}]>

3、多对多

#查询书籍  办公室 是那些作者写的
   # 正向查询
   new_book_authors = models.Book.objects.filter(name='办公室').values('authors__name')
   print(new_book_authors)  #<QuerySet [{'authors__name': '黄黄'}, {'authors__name': '小泽玛利亚-2'}]>
   # 反向查询
   new_book_authors_reverse = models.Author.objects.filter(book__name='办公室').values('name')
   print(new_book_authors_reverse)  #<QuerySet [{'name': '黄黄'}, {'name': '小泽玛利亚-2'}]>
   
# 查询作者 黄黄 写了那些书
   # 正向查询
   new_author_books = models.Book.objects.filter(authors__name='黄黄').values('name')
   print(new_author_books)  #<QuerySet [{'name': '双色球'}, {'name': '办公室'}]>
   #反向查询
   new_author_books_reverse = models.Author.objects.filter(name='黄黄').values('book__name')
   print(new_author_books_reverse) #<QuerySet [{'book__name': '双色球'}, {'book__name': '办公室'}]>
   
   
######################################进阶 ##########################  
# 查询 上海出版社 出版的书名及作者名
#方式一
   new_pubilc_books_authors = models.Book.objects.filter(publishs__name='上海出版社').values('name','authors__name')
   print(new_pubilc_books_authors)  #<QuerySet [{'name': '狼的诱惑', 'authors__name': '小泽玛利亚-2'}, {'name': '双色球', 'authors__name': '黄黄'}, {'name': '双色球', 'authors__name': '小泽玛利亚-2'}]>

   
   
#方式二
   new_pubilc_books_authors_reverse = models.Public.objects.filter(name='上海出版社').values('book__name','book__authors__name')
   print(new_pubilc_books_authors_reverse)  
   #<QuerySet [{'book__name': '狼的诱惑', 'book__authors__name': '小泽玛利亚-2'}, {'book__name': '双色球', 'book__authors__name': '黄黄'}, {'book__name': '双色球', 'book__authors__name': '小泽玛利亚-2'}]>
   

聚合

 ###################聚合############
   new_prices = models.Book.objects.all().aggregate(a=Avg('price'))
   print(new_prices)  #{'a': 250280.1}
 
posted @ 2022-09-06 10:27  小鱼鱼与黄黄  阅读(126)  评论(0编辑  收藏  举报