Django之模型层(2) (3)

反向查询(按表名:book_set):

publish=Publish.objects.get(name="苹果出版社") #publish.book_set.all() : 与苹果出版社关联的所有书籍对象集合 book_list=publish.book_set.all() for book_obj in book_list: print(book_obj.title)

2、一对一查询(Author与AuthoDetail)

正向查询(按字段:authorDetail):

egon=Author.objects.filter(name="egon").first() print(egon.authorDetail.telephone)

反向查询(按表名:author):

# 查询所有住址在北京的作者的姓名 authorDetail_list=AuthorDetail.objects.filter(addr="beijing") for obj in authorDetail_list: print(obj.author.name)

3、多对多查询(Author与Book)

正向查询(按字段:authors):

# 金瓶眉所有作者的名字以及手机号 book_obj=Book.objects.filter(title="金瓶眉").first() authors=book_obj.authors.all() for author_obj in authors: print(author_obj.name,author_obj.authorDetail.telephone)

反向查询(按表名:book_set):

# 查询egon出过的所有书籍的名字 author_obj=Author.objects.get(name="egon") book_list=author_obj.book_set.all() #与egon作者相关的所有书籍 for book_obj in book_list: print(book_obj.title)

注:你可以通过在 ForeignKey() 和ManyToManyField的定义中设置 related_name 的值来覆写 FOO_set 的名称。例如,如果 Article model 中做一下更改:

publish = ForeignKey(Book, related_name='bookList')

那么接下来就会如我们看到这般:

# 查询 人民出版社出版过的所有书籍 publish=Publish.objects.get(name="人民出版社") book_list=publish.bookList.all() # 与人民出版社关联的所有书籍对象集合  四、基于双下划线的跨表查询

Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系。要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的 model 为止。

关键点:正向查询按字段,反向查询按表名。

1、一对多查询

# 练习1: 查询苹果出版社出版过的所有书籍的名字与价格(一对多) # 正向查询 按字段:publish queryResult=Book.objects             .filter(publish__name="苹果出版社")             .values_list("title","price") # 反向查询 按表名:book queryResult=Publish.objects               .filter(name="苹果出版社")               .values_list("book__title","book__price")

2、多对多查询

# 练习2: 查询yuan出过的所有书籍的名字(多对多) # 正向查询 按字段:authors: queryResult=Book.objects             .filter(authors__name="yuan")             .values_list("title") # 反向查询 按表名:book queryResult=Author.objects               .filter(name="yuan")               .values_list("book__title","book__price")

3、混合使用

# 练习3: 查询人民出版社出版过的所有书籍的名字以及作者的姓名 # 正向查询 queryResult=Book.objects             .filter(publish__name="人民出版社")             .values_list("title","authors__name") # 反向查询 queryResult=Publish.objects               .filter(name="人民出版社")               .values_list("book__title","book__authors__age","book__authors__name") # 练习4: 手机号以151开头的作者出版过的所有书籍名称以及出版社名称 queryResult=Book.objects             .filter(authors__authorDetail__telephone__regex="151")             .values_list("title","publish__name")

注:反向查询时,如果定义了related_name ,则用related_name替换表名,例如:

publish = ForeignKey(Blog, related_name='bookList') 练习1: 查询人民出版社出版过的所有书籍的名字与价格(一对多) #反向查询 不再按表名:book,而是related_name:bookList queryResult=Publish.objects           .filter(name="人民出版社")           .values_list("bookList__title","bookList__price")  五、聚合查询与分组查询

1、聚合 aggregate(*args, **kwargs)

# 计算所有图书的平均价格 >>> from django.db.models import Avg >>> Book.objects.all().aggregate(Avg('price')) {'price__avg': 34.35}

aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。

>>> Book.objects.aggregate(average_price=Avg('price')) {'average_price': 34.35}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfyjg.html