Django 查询集过滤器 - Q() | VS __in

标签 django filter django-queryset django-orm django-q

之间有什么区别

queryset.filter(Q(foo='bar') | Q(foo='baz'))


queryset.filter(foo__in=['bar', 'baz'])

我发现有时它们会产生不同的结果,我不知道为什么。

我通过这些查询得到不同的结果:
In [8]: Profile.objects.filter(image="").count()
Out[8]: 7173

In [9]: Profile.objects.filter(image=None).count()
Out[9]: 25946

In [10]: Profile.objects.filter(image__in=["", None]).count()
Out[10]: 7173

In [11]: Profile.objects.filter(Q(image="") | Q(image=None)).count()
Out[11]: 33119

我使用 PostgreSQL 作为我的数据库引擎。

最佳答案

首先将生成查询:

SELECT .... FROM ... WHERE (FOO = 'bar' OR FOO = 'baz');

第二个将生成查询:
SELECT .... FROM ... WHERE (FOO IN ('bar', 'baz'));

两个查询应该计算出相同的结果,但可能存在一些性能差异,具体取决于数据库后端。一般使用 in应该更快。

关于Django 查询集过滤器 - Q() | VS __in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32904104/

相关文章:

python - Django:属性和查询集注释之间的重复逻辑

django - 按字符的确切位置过滤对象

python - 大型 django 表上的高效数据迁移

django - 带有轻松缩略图的Django Rest框架

javascript - 403 Forbidden 和 request.method 在 django 中显示 GET

java - 修改Filter中URI的PathParam

抽象基类的 Django 模型字段

python - Django:使用 mod_wsgi 创建的 SOCK 文件的权限错误

filter - 在elasticsearch中找到所有由嵌套过滤的

linux - 来自 Ansible stdout_lines 结果的过滤行