企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
### 查询对象(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> 第一种是合法的,第二种是不合法的