Django 过滤器可能包含 None

rur*_*urp 4 python django django-models python-3.x

在过滤值列表时是否可以包含 None ?

>>> MyModel.objects.filter(amount=10).count()
9
>>> MyModel.objects.filter(amount=None).count()
30
>>> MyModel.objects.filter(amount__in=[10]).count()
9
>>> MyModel.objects.filter(amount__in=[None, 10]).count()
9
Run Code Online (Sandbox Code Playgroud)

我希望最后一次调用返回 39,而不是 9。

在我的实际用例中,要过滤的值列表中可能包含也可能不包含任何内容。我可以使用 if/else 块来检查值列表中是否存在 None ,并在需要时使用 Q 对象构建查询,但对于大量过滤器这样做会变得一团糟。一定有更好的方法,对吗?

NS0*_*NS0 7

我认为你需要使用 Q 对象,这样可能就不会变得一团糟:

MyModel.objects.filter(Q(amount__isnull=True) | Q(amount__in=the_list)).count()
Run Code Online (Sandbox Code Playgroud)

并且仅包含第一部分(如果None在列表中)...

或者类似的东西:

query = Q(amount__in=the_list)
if None in the_list:
    query |= Q(amount__isnull=True)

MyModel.objects.filter(query).count()
Run Code Online (Sandbox Code Playgroud)

不确定是否有更好的方法。