我可以在两个具有共享外键值的模型之间创建相关的Django字段吗?

时间:2019-03-29 18:07:31

标签: django django-models django-model-field

我有两个模型:

class Foo(Model):

     special_id = IntegerField(primary_key=True)

class FooDetail(Model):

     special_id = IntegerField(primary_key=True)

special_id来自外部来源-这是另一个数据库的外键。是的,FooFooDetail应该合并为一个模型-但假设我不能-我可以在两个模型之间创建一个相关字段,以便可以在查询中使用它(例如在valuesselect_related中)?

我可以在ForeignKey('FooDetail')中添加一个Foo,但是实际上我将两次存储special_id

1 个答案:

答案 0 :(得分:0)

如果要将ORM的功能用于相关模型,则应在两个模型之间创建一个关系(在这种情况下为one-to-one)。在其中一个模型中,您可以(并且应该)省略special_id参考。


您可以在FooDetail中将外键用作主键,如果在special_id中将Foo用作主键,则将保存完全相同的类型,并且如您的示例所示的列数和数据量(即每列中包含相关的special_id)。

您得到的是关系和强制完整性的好处。

唯一的区别是,当您引入一个新的special_id时,您必须首先创建Foo才能在FooDetail中指向它–付出的代价不菲。


如果在将参考字段设置为Foo作为主键时收到警告,则可能是您将其定义为ForeignKey。如上所述,由于您要处理一对一关系,因此应将字段定义为OneToOneField。从技术上讲,该字段仍然是外键(=引用另一个表中行的主键),这就是为什么我使用此术语;但是它有一个独特的约束,可以用作主键。