Django 查询集过滤器 - Q() | VS __in
Django queryset filter - Q() | VS __in
有什么区别
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
应该会更快。
有什么区别
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
应该会更快。