Python Django-检查非外键整数字段是否作为另一个模型的主键存在?
假设您拥有以下旧款型号:Python Django-检查非外键整数字段是否作为另一个模型的主键存在?,python,django,Python,Django,假设您拥有以下旧款型号: class Foo(models.Model): bar_id = models.IntegerField(null=True, blank=True) # more fields bar\u id应该是指bar型号中的主键,但由于某些原因,它没有注册为外键。现在,我如何过滤掉所有没有相应的Bar对象的Foos?我们可以列出Bars的主键,然后过滤掉所有引用该主键的Foos Foo.objects.exclude(bar_id__in=Bar.obje
class Foo(models.Model):
bar_id = models.IntegerField(null=True, blank=True)
# more fields
bar\u id
应该是指bar
型号中的主键,但由于某些原因,它没有注册为外键。现在,我如何过滤掉所有没有相应的Bar
对象的Foo
s?我们可以列出Bar
s的主键,然后过滤掉所有引用该主键的Foo
s
Foo.objects.exclude(bar_id__in=Bar.objects.all().values_list('pk', flat=True))
Foo.objects.exclude(bar\u id\u in=bar.objects.all().values\u list('pk',flat=True))
这是一个QuerySet
,它将为所有Foo
对象提供一个“无效”的bar\u id
(因此是一个id
,它指向一个不存在的bar
)
但是最好使用
ForeignKey
,因为大多数数据库都会以透明的方式强制执行此约束。因此,数据库通常确保根本不存在这样的行。通常,您还向其添加触发器,以防引用的条对象被删除。阅读一些注释使我了解OP更愿意实现外键,但由于数据库中的数据损坏/丢失,因此无法实现
两种解决方案:
在模型中将列标记为外键,但不要强制执行
在数据库中(使用--fake
标志,同时使用manage.py
这种方法实际上有助于更好地定义您的业务
/为逻辑建模,并在本地开发和应用程序中加强数据完整性
环境
在模型中将列标记为外键并使用
db_constraint=False
flag。请阅读更多信息。使用此方法
对于数据完整性已受到损害的旧式系统
您只需要使用Django的ORM以自然的方式连接
这看起来很棒。我会试试。实际上,这是一个遗留项目,包含现有数据库数据(并且删除了一些Bar
s),因此将字段更改为外键可能不是最好的主意。顺便说一句,谢谢。事实上,经过进一步调查,我发现他们没有将其设置为外键的原因是该字段应该是一个通用id字段。也就是说,它可以引用另一个模型的外键(除了Bar)。但感谢您的回答。