我有两个模型:
class Foo(Model):
special_id = IntegerField(primary_key=True)
class FooDetail(Model):
special_id = IntegerField(primary_key=True)
special_id
来自外部来源-这是另一个数据库的外键。是的,Foo
和FooDetail
应该合并为一个模型-但假设我不能-我可以在两个模型之间创建一个相关字段,以便可以在查询中使用它(例如在values
或select_related
中)?
我可以在ForeignKey('FooDetail')
中添加一个Foo
,但是实际上我将两次存储special_id
。
答案 0 :(得分:0)
如果要将ORM的功能用于相关模型,则应在两个模型之间创建一个关系(在这种情况下为one-to-one)。在其中一个模型中,您可以(并且应该)省略special_id
参考。
您可以在FooDetail
中将外键用作主键,如果在special_id
中将Foo
用作主键,则将保存完全相同的类型,并且如您的示例所示的列数和数据量(即每列中包含相关的special_id
)。
您得到的是关系和强制完整性的好处。
唯一的区别是,当您引入一个新的special_id
时,您必须首先创建Foo
才能在FooDetail
中指向它–付出的代价不菲。
如果在将参考字段设置为Foo
作为主键时收到警告,则可能是您将其定义为ForeignKey
。如上所述,由于您要处理一对一关系,因此应将字段定义为OneToOneField
。从技术上讲,该字段仍然是外键(=引用另一个表中行的主键),这就是为什么我使用此术语;但是它有一个独特的约束,可以用作主键。