Django queryset将null值与null OuterRef匹配

Django queryset将null值与null OuterRef匹配,django,orm,Django,Orm,在Django中,我试图通过是否存在具有相同值的Bar对象来过滤Foo对象。 我下面的代码适用于非空值。但是如果Foo.baz和Bar.baz都为null,我也希望它返回true Foo.objects.filter(Exists(Bar.objects.filter(baz=OuterRef('baz'), qux=OuterRef('qux')) 我知道NULL在SQL中不等于NULL,所以我尝试过以下各种公式: baz__isnull=... 但我没走多远。有没有办法做到这一点?您可以

在Django中,我试图通过是否存在具有相同值的Bar对象来过滤Foo对象。 我下面的代码适用于非空值。但是如果Foo.baz和Bar.baz都为null,我也希望它返回true

Foo.objects.filter(Exists(Bar.objects.filter(baz=OuterRef('baz'), qux=OuterRef('qux'))
我知道NULL在SQL中不等于NULL,所以我尝试过以下各种公式:

baz__isnull=...

但我没走多远。有没有办法做到这一点?

您可以注释
OuterRef('baz')
的值,并在过滤器中使用它。因为您需要执行或使用您需要的条件。此外,由于存在此错误,在带注释的
OuterRef
上进行过滤似乎无法工作,但我们可以通过使用
ExpressionWrapper
手动指定
输出\u字段来解决此问题。因此,如果
baz
是一个
IntegerField
,您的查询将如下所示:

从django.db.models导入ExpressionWrapper,F,IntegerField,Q
q_object=q(baz=F('outer_baz'))|(q(baz_uuisnull=True)和q(outer_ubaz_uisnull=True))
Foo.objects.filter(
存在(
Bar.objects.annotate(
外部_baz=表达式包装器(
OuterRef('baz'),
输出\字段=整数字段()
)#克服缺陷的变通方法
).过滤器(
q_对象,
qux=OuterRef('qux')
)
)
)

试着这样看你的查询:print(queryset.query)谢谢Abdul。这似乎是一个很好的建议。但我在尝试时遇到了一个错误-“ResolveDouteRef”对象没有“get_lookup”属性。我做错了什么吗?@peaky76看起来你使用的Django版本低于3.0,你所描述的是一个缺陷,它在Django 3.0及以上版本中得到修复,但在较低版本中没有。我在3.1.7上,所以我一定是做错了什么。我会继续努力的。@peaky76看来我把你的错误误认为了,你的错误实际上是一个悬而未决的问题。我在上面的回答中描述了一个解决方法,它是有效的!非常感谢你,阿卜杜勒,你帮了我大忙。