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

Ros*_*ote 6 django filter django-orm django-queryset django-q

有什么区别

queryset.filter(Q(foo='bar') | Q(foo='baz'))
Run Code Online (Sandbox Code Playgroud)

queryset.filter(foo__in=['bar', 'baz'])
Run Code Online (Sandbox Code Playgroud)

我发现有时他们会产生不同的结果,我无法弄清楚为什么.

我对这些查询得到了不同的结果:

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
Run Code Online (Sandbox Code Playgroud)

我正在使用PostgreSQL作为我的数据库引擎.

Gwy*_*idD 9

首先会生成查询:

SELECT .... FROM ... WHERE (FOO = 'bar' OR FOO = 'baz');
Run Code Online (Sandbox Code Playgroud)

第二个会生成查询:

SELECT .... FROM ... WHERE (FOO IN ('bar', 'baz'));
Run Code Online (Sandbox Code Playgroud)

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

  • 根据你的编辑,在SQL`IN`中无法与`NULL`值进行比较,因为没有任何东西等于null,它是null或者它不是,并且在许多后端它不起作用.你应该在这里使用"OR"来实现你的结果. (3认同)