Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-检查非外键整数字段是否作为另一个模型的主键存在?_Python_Django - Fatal编程技术网

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)。但感谢您的回答。