【问题标题】:Can I create a related Django field between two models with a shared foreign key value?我可以在具有共享外键值的两个模型之间创建相关的 Django 字段吗?
【发布时间】:2019-08-20 17:45:00
【问题描述】:

我有两个模型:

class Foo(Model):

     special_id = IntegerField(primary_key=True)

class FooDetail(Model):

     special_id = IntegerField(primary_key=True)

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

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

【问题讨论】:

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


【解决方案1】:

如果您想为相关模型使用 ORM 的功能,您应该在两个模型之间创建关系(在本例中为one-to-one)。在其中一个模型中,您可以(并且应该)省略 special_id 参考。


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

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

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


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

【讨论】:

  • 是的,这就是我害怕的。没什么大不了的,但它为 FooDetail 添加了一个不需要的主键。
  • Django 对使用外键作为主键给出了一个很大的警告,所以我继续并留下了 special_id 和外键......它们都具有相同的值。
猜你喜欢
  • 2016-06-15
  • 2019-02-13
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多