【问题标题】:How to set up Django model inheritance with foreign key如何使用外键设置 Django 模型继承
【发布时间】:2019-11-17 17:21:54
【问题描述】:

我有三个模型,一个超类和两个子类。两个子类都属于另一个模型(通过外键表示)。

我不确定我的 FK 的最佳设置是什么样的?我是否将外键放在超类、子类或两者中?也许不仅有一种方法,还有多种方法?

每个建筑物都可以有许多能源对象,这意味着它可以有许多加热和冷却对象。每个 Heating/Cooling/Energy 对象都属于一个建筑物。所以经典的一对多关系用外键表示。

这是我的模型:

超类

class Energy(models.Model):
   year : models.BigIntegerField(...)
   value : models.IntegerField(...)
   connected_building : ForeignKey ??????

子类

class Heating(Energy): 
   connected_building : ForeignKey ?????


class Cooling(Energy): 
   connected_building : ForeignKey ?????

相关类

class Building(models.Model):
  name = models.Charfield(...)

我有点害怕弄乱我的数据库,所以非常感谢任何帮助。提前致谢!

【问题讨论】:

  • 我认为它应该在超类中
  • 感谢 ruddra 的评论。因此,如果我将它放入超类中,它将被子类继承,并且每次我创建一个新的加热/冷却对象时,它都会与建筑物动态相关。新能源物体也一样?

标签: django django-models foreign-keys


【解决方案1】:

使Energy 成为一个抽象超类,您不必在数据库中处理单独的能量表。您可以按照您的描述将建筑物的 ForeignKey 保留在 Energy 模型中。更多抽象模型的信息可以在here找到。

【讨论】:

  • 谢谢卡格里亚斯。是的,我想这就是我需要的。只是为了确定:因为它不会创建数据库表,所以我不能创建能量实例,对吗?并且给超类能量一个外键,将确保(通过继承)我的子类有一个将它们与建筑物相关联的外键字段,对吧?
  • 您不会有 Energy 表,但您从 Energy 表继承的所有模型都会有 ForeignKey 字段。
  • 我会选择这个。但只是为了学习目的。如果我还需要创建能量类的实例,该怎么办?将 FK 放入超类或子类中?
  • 你只需要删除abstract = True :) 剩下的都是一样的。
  • 太棒了!非常感谢!
猜你喜欢
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2012-10-12
  • 2012-01-18
  • 1970-01-01
相关资源
最近更新 更多