Skip to main content
 首页 » 编程设计

python之Django之检查非外键整数字段是否作为另一个模型的主键存在

2024年09月07日22lautakyan007

假设您有以下遗留模型:

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 对象被删除时要执行的操作。