### 查询对象(Query Object)
一般见过的项目里用到的Django查询对象就两个,一个是Q,一个是F,同时Q基本是随处可见,F就比较少了,下面详细写下
<br>
#### F对象
文档里介绍的F对象的作用是在同张表的不同字段之间进行比较时使用的一种对象,用法示例如下
~~~
from django.db.models import F
Entry.objects.filter(n_comments__gt=F('n_pingbacks'))
~~~
相当于找Entry这张表中n_comments比n_pingbacks多的行,这种用法其实直接用SQL还不太好写,用Django这种写法就很方便了
F还可以使用运算符
~~~
>>> Entry.objects.filter(n_comments__gt=F('n_pingbacks') * 2)
>>> Entry.objects.filter(rating__lt=F('n_comments') + F('n_pingbacks'))
~~~
跨表查询也是可以的,下面的语句Entry和Blog是假定没有外键关联的
~~~
>>> Entry.objects.filter(authors__name=F('blog__name'))
~~~
<br>
#### Q对象
Q对象就很常见了,而且也在项目里使用过了,实际上就是把SQL中的WHERE里的条件拆成一个个分离的放到Q当中然后再进行逻辑组合例如OR,AND之类的,Q同样也可以调用lookuptype来进行设置
例如,下面的语句产生一个Q对象,表示两个"question__startswith"查询的“OR”
~~~
Q(question__startswith='Who') | Q(question__startswith='What')
~~~
<br>
同时Q和普通的关键字参数可以混用,但是Q必须在关键字参数的前面
~~~
Poll.objects.get(
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
question__startswith='Who')
Poll.objects.get(
question__startswith='Who',
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))
~~~
<br>
第一种是合法的,第二种是不合法的
- Django基础
- 模型
- 外键
- Model Manager
- 过滤器函数
- 查询对象
- 字段的细节
- QuerySet的应用
- 视图
- Django类视图
- 权限控制
- Django进阶
- 中间件
- _meta组件
- 信号
- User模块
- prefetch_related和select_related的区别
- 较少被用到的查询对象
- Django的深层设计理念
- Declarative Syntax
- django的migration操作
- 较少用到的Queryset方法的一些坑
- Django配置
- Django环境配置变量
- Django源码阅读
- ORM
- QuerySet源码
- Query源码
- Q&F
- Model和Manager的详解
- Http请求响应
- HttpRequest
- 自建数据结构
- Django开发辅助工具
- Django-rest-framework
- Serializer
- 异步任务调度器Celery
- 数据库补充
- 定义
- 字段
- 事务
- 视图
- 函数
- 联结
- 窗口函数
- GROUPING运算符
- HAVING谓词
- django_bulk_update
- django_bulk_update源码分析
- 项目小功能开发
- Django的一些小细节