在 Django 中,我尝试通过是否存在具有相同值的 Bar 对象来过滤 Foo 对象。我下面的代码适用于非空值。但如果 Foo.baz 和 Bar.baz 都为 null,我也希望它返回 true。
Foo.objects.filter(Exists(Bar.objects.filter(baz=OuterRef('baz'), qux=OuterRef('qux'))
Run Code Online (Sandbox Code Playgroud)
我知道 NULL 不等于 SQL 中的 NULL,所以尝试了如下各种表述:
baz__isnull=...
Run Code Online (Sandbox Code Playgroud)
但我还没有走得太远。有办法实现这一点吗?
您可以注释其值OuterRef('baz')并在过滤器中使用它。由于您需要执行 OR 条件,因此您需要使用Q对象 [Django docs]。此外,OuterRef由于此错误具有Ticket #31714,因此对带注释的过滤似乎不起作用,但我们可以通过使用ExpressionWrapper手动指定output_field. 因此,如果baz是IntegerField您的查询将如下所示:
from django.db.models import ExpressionWrapper, F, IntegerField, Q
q_object = Q(baz=F('outer_baz')) | (Q(baz__isnull=True) & Q(outer_baz__isnull=True))
Foo.objects.filter(
Exists(
Bar.objects.annotate(
outer_baz=ExpressionWrapper(
OuterRef('baz'),
output_field=IntegerField()
) # Workaround to overcome bug
).filter(
q_object,
qux=OuterRef('qux')
)
)
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1151 次 |
| 最近记录: |