0

我有两个模型:

class Foo(Model):

     special_id = IntegerField(primary_key=True)

class FooDetail(Model):

     special_id = IntegerField(primary_key=True)

special_id来自外部来源——它是另一个数据库的外键。是的,Foo应该FooDetail组合成一个模型——但假设我不能——我可以在两个模型之间创建一个相关字段,以便我可以在查询中使用它(比如 invaluesselect_related)?

我可以添加一个ForeignKey('FooDetail')in Foo,但我基本上会存储special_id两次。

4

1 回答 1

0

如果你想为相关模型使用 ORM 的特性,你应该在两个模型之间创建一个关系(在这种情况下是一对一的)。在其中一个模型中,您可以(并且应该)省略special_id参考。


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

你得到的是关系和强制诚信的好处。

唯一的区别是,当你引入一个新的special_id,你必须先创建Foo才能指向它FooDetail——这几乎不是一个大的代价。


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

于 2019-03-29T18:25:06.037 回答