django.db.models.query.QuerySet
QuerySet的特点:
- 是可迭代的
- 可切片
查询相关的API
- get(**kwargs):返回与所给的筛选条件相匹配的对象,返回的结果有且只有一个,如果符合条件的对象超过一个会抛出app名.models.MultipleObjectsReturned异常,如果没有找到符合条件的查询会抛出 app名.models.DoesNotExist异常---model对象
- all():会查询所有结果---QuerySet对象
- filter(**kwargs):它包含那些与所给筛选条件匹配的对象---QuerySet对象
- exclude(**kwargs):它包含那些与所给筛选条件不匹配的对象---QuerySet对象
- order_by(*fields):对查询的结果排序(在查询的字段前加-号可按结果的反向排序)
- reverse():对查询的结果再进行反排序
- disinct():对查询的结果去重
- values(*fields):返回一个VaulesQuerySet--一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
- values_list(*fields):它与vaules()结果相似,不过后者返回的是字典序列,而vaules_list返回的结果是元祖序列
- count():返回数据库中匹配查询(QuerySet)的对象数量
- first():返回第一条数据等价于[0]
- last():返回最后一条数据等价于[-1]
- exists():是否存在数据(True|False)
- 更多api在model层的 查询结果集(QuerySet)中的QuerySet method reference(查询结果集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")
总结:多表查询的技巧
- __ : 两个下划线可以生成连接查询(内连接外联接都可以 这里还不懂 ),查询关联的字段信息
- _set : 提供了对象访问相关表数据的方法。但是这种方法只能是相关类访问定义了关系的类(主键类访问外键类)
书籍类中有一个字段publisher就是引用的出版社类的主键,虽然出版社类中并没有定义书籍有关的信息但是我们还是可以通过_set方法查询到出版社出版的图书----此方法只适用于model对象不适用与QuerySet对象
Publisher.objects.get(name="中国出版社").book_set.all().values("title")
models之聚合查询函数和分组查询函数
在 django.db.models里 使用前需要先导入
- annotate(*args, **kwargs):可以为QuerySet中的每个对象添加注解。可以通过计算查询结果中的每个对象所关联的对象集合,从而得出总计值(也可以是平均值等),用于分组查询,annotate前的vaules当作分组条件
- aggregate(*args, **kwargs):通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中的每个参数都指定一个包含在字典中的返回值,用于聚合查询
----------使用原生的sql
当业务背景很复杂的时候 orm并不能提供很好的支持这时候就可以使用原生的SQL
- extra : 结果集修改器,一种提供额外查询参数的机制
- raw : 执行原始的sql并返回模型实例
- 直接执行自定义SQL:这种方式完全不依赖model前面两种方式还要依赖于model from django.db import connection