django基础

7.models之查询

2017-10-04  本文已影响0人  qy1994

django.db.models.query.QuerySet
QuerySet的特点:

  1. 是可迭代的
  2. 可切片

查询相关的API


多表联合查询

一:查询id为1的作者的所有信息

#一般用这种方式获取信息,但是不利于获取信息
AuthorDetail.objects.filter(id=1)
# 这种方式可以很好的打印出所有信息,但是作者返回的是id不友好,应该返回姓名比较好
AuthorDetail.objects.filter(id=1).values("id", "sex", "email", "address", "birthday", "author")
# 有主外的可以通过两个下划线接要查询的字段来查询
AuthorDetail.objects.filter(id=1).values("id", "sex", "email", "address", "birthday", "author__name")

二:查询《python实战》这本书的作者姓名和出版社

Book.objects.filter(title="python实战").values("authors__name", "publisher__name")

三:查询jack写过的书,及书籍的出版社信息

Book.objects.filter(authors__name="jack").values("title", "publisher__name")

总结:多表查询的技巧

书籍类中有一个字段publisher就是引用的出版社类的主键,虽然出版社类中并没有定义书籍有关的信息但是我们还是可以通过_set方法查询到出版社出版的图书----此方法只适用于model对象不适用与QuerySet对象
Publisher.objects.get(name="中国出版社").book_set.all().values("title")

models之聚合查询函数和分组查询函数
在 django.db.models里 使用前需要先导入

  1. annotate(*args, **kwargs):可以为QuerySet中的每个对象添加注解。可以通过计算查询结果中的每个对象所关联的对象集合,从而得出总计值(也可以是平均值等),用于分组查询,annotate前的vaules当作分组条件
  2. aggregate(*args, **kwargs):通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中的每个参数都指定一个包含在字典中的返回值,用于聚合查询

----------使用原生的sql

当业务背景很复杂的时候 orm并不能提供很好的支持这时候就可以使用原生的SQL

上一篇 下一篇

猜你喜欢

热点阅读