小编Wes*_*ley的帖子

为什么 Django 外键 id __in 查询无法匹配 None?

在可以为空的外键上过滤查询集时,我可以按 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)

django django-models django-3.2

1
推荐指数
1
解决办法
545
查看次数

标签 统计

django ×1

django-3.2 ×1

django-models ×1