在可以为空的外键上过滤查询集时,我可以按 ID 值 ( foo_id=123) 或 None ( foo_id=None) 进行过滤。但是,如果我尝试按列表 ( foo_id__in=[123, None]) 进行过滤,则会None被忽略。
为什么会发生这种情况?使用包含 None 的列表过滤外键的最佳解决方法是什么?
例子:
from django.db import models
class Foo(models.Model):
name = models.CharField(max_length=100)
class Bar(models.Model):
foo = models.ForeignKey(Foo, on_delete=models.PROTECT,
blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
foo = Foo.objects.create(name='myfoo')
Bar.objects.create(foo=foo)
Bar.objects.create(foo=None)
Bar.objects.count() # 2
Bar.objects.filter(foo_id=foo.id).count() # 1
Bar.objects.filter(foo_id=None).count() # 1
Bar.objects.filter(foo_id__in=[foo.id, None]).count() # 1 - Expected 2!
Run Code Online (Sandbox Code Playgroud)