假设您有以下遗留模型:
class Foo(models.Model):
bar_id = models.IntegerField(null=True, blank=True)
# more fields
bar_id 应该引用 Bar 模型中的主键,但由于某种原因,它没有注册为外键。现在,如何过滤掉所有没有对应 Bar 对象的 Foo?
请您参考如下方法:
我们可以列出Bar的主键,然后过滤掉所有引用该主键的Foo。
Foo.objects.exclude(<b>bar_id__in</b>=Bar.objects.all().values_list('pk', flat=True))
这是一个 QuerySet,它将为所有 Foo 对象提供一个“invalid”bar_id(因此id 指的是一个不存在的Bar)。
但最好使用 ForeignKey,因为大多数数据库将以透明的方式强制此约束。因此,数据库通常会确保根本不存在此类行。通常,您还可以向其添加触发器,例如在引用的 Bar 对象被删除时要执行的操作。
