在Django中使用Foreign Key有什么好处?

时间:2010-10-11 22:00:01

标签: django django-models

这是一个非常天真的问题。正如您所知,它来自对数据库或Django不太了解的人。

在Django中使用ForeignKeys有什么好处?

也许一个例子可以帮助我更好地理解。我已经有这样的表了:

City:
    id = IntegerField() # e.g. 15
    name = CharField() # e.g. 'Rome'    
Country:
    name = CharField() e.g. 'Italy'
    capital = IntegerField() # e.g 15

我是否应该将资金更改为ForeignKey(City),如果是,为什么?某些事情变得更快,更方便,还是更好?

谢谢!

3 个答案:

答案 0 :(得分:4)

外键是数据模型的约束,可以确保一致性。基本上,在您的示例中,如果您没有capital作为ForeignKeyCity,则可能包含id City的{​​{1}}不存在!当您使用ForeignKey时,它会对数据库设置一个约束,以便您不能删除当前由其他内容引用的内容。因此,如果您在删除以该城市为首都的名为City的{​​{1}}之前尝试删除名为"Rome"的{​​{1}},则不允许您这样做。

使用Country可以确保您永远不必担心关系另一端的“事物”是否仍然存在。

答案 1 :(得分:3)

使用ForeignKeys使Django能够“了解”关系。因此,您可以在不关注它们如何存储的情况下遵循关系,例如,您可以执行以下操作而无需关心如何存储关系:

country = Country.objects.get(pk=1)
print country.capital.name
italy = Country.objects.get(capital__name="Rome")

另外,为了保持约束,Django在删除ForeignKey引用的对象时将遵循关系。 Django还会跟踪反向关系(无需明确定义它们),所以你可以做一些像= rome.country_set.all()这样的东西(在这个例子里没那么有意义,因为它会更有意义在这里使用OneToOneField ...

答案 2 :(得分:1)

参照完整性。 OTOH很可能拥有一个既不知道也不关心FK的数据库 - 事实上我在工作中使用这样的遗留数据库。