Shawn's Blog
目录 · 5 节

使用 Django 中的 Q 对象查询

0X00 普通的查询

python
1from django.db.models import Q
2
3queryset.filter(Q(age=233)) # 找到233岁的人
4queryset.filter(Q(name='shawn')) # 找到名为shawn的人

这种查询方式与普通的方式比起来没什么区别。

python
1queryset.filter(age=233)
2queryset.filter(name='shawn')

0X01 AND

python
1from django.db.models import Q
2
3queryset.filter(Q(age__range=(18, 25), Q(gender='F'), Q(beautiful=True)) # 找到18到25岁的漂亮女生

把多个条件用逗号分割开就可以了,或者使用&符分割开。

0X02 OR

python
1from django.db.models import Q
2
3queryset.filter(Q(gender='F') | Q(province=u'四川') | Q(name=u'王铁蛋'))

这里用|符号分割开筛选条件,最终筛选得到的是”所有女生、四川人和叫王铁蛋的人”,也就是说相当于分别筛选了这三个条件,最终取了并集。这种查询如果用普通方法进行查询就会很麻烦,可能要写成下面这样:

python
1queryset.filter(gender='f') | queryset.filter(province=u'province=u'四川') | queryset.filter(name=u'王铁蛋')

0X03 NOT

使用Not查询的方式就比较诡异了

python
1from django.db.models import Q
2
3queryset.filter(~Q(gender='M')) # 找到非男生

0X04 组合技

有的时候经常需要查询同样的条件多次,这种方法就可以一次编写查询条件多次执行

python
1import operator
2from django.db.models import Q
3
4q1 = reduce(operator.and_, Q(gender='F', age__range=(18, 25)))
5q2 = reduce(operator.or_, Q(gender='M', age__range(3, 5)))
6
7queryset.filter(q1)
8queryset.filter(q2)
本文标题
使用 Django 中的 Q 对象查询
文章作者
Shawn
版权声明
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

如果这篇文章对你有帮助,可以请我喝杯咖啡 ☕

评论