我正在建模一个系统,该系统使用一个配方中的少量输入来创建输出。输入具有输出属性的子集,但复杂的是输出也可以用作输入。配方需要不同数量的不同输入。理想情况下,我想这样做:如何最好地构建django模型以适应场景?
class CommonAttrs(models.Model):
name = model.CharField()
value = model.FloatField()
cost = model.FloatField()
class Meta:
abstract = True
class Input(CommonAttrs):
pass
class Output(CommonAttrs):
price = model.FloatField()
demand = model.FloatField()
...
class Recipe(models.Model):
output = model.ForeignKey(Output)
input_1 = model.OneToMany([Input, Output]) # I can dream
quantity_1 = model.FloatField()
input_2 = model.OneToMany([Input, Output])
quantity_2 = model.FloatField()
input_3 = model.OneToMany([Input, Output])
quantity_3 = model.FloatField()
input_4 = model.OneToMany([Input, Output])
quantity_4 = model.FloatField()
然而,代替在Django一个一对多的关系,我做:
class Recipe(models.Model):
output = model.ForeignKey(Output)
input = model.ManyToManyField(Input, through='Measures')
class Measures(models.Model):
recipe = model.ForeignKey(Recipe)
input = model.ForeignKey(Input)
quantity = model.FloatField()
这是所有罚款,但错过的关键细节输出也是配方的输入。我在数据库中创建一个视图,并试图在地方输入来创建一个新的非托管模式:
class InputOrOutput(CommonAttrs):
class Meta:
managed = False
db_table = 'input_union_output_view' # Does what is says on the tin
然而,这导致与初始化和迁移问题的泥潭。
我最后的手段是创建一个完整的表格而不是视图,但是这感觉就像是从不一致的数据中寻找令人头痛的问题。
有什么更好的选择?
好的。所以输出也可以是输入。首先我想知道的是,如果将它们放在一个表中,可能会用布尔值表示“仅输入”,如果相关的话会更有意义。如果你想用'input_1'做的事情是链接到输入*或*输出,那实际上是可能的,它只需要更多的字段。如果我们能够澄清将这些分为两个表格的必要性,很高兴提供一些代码。通用FK文档在这里:https://docs.djangoproject.com/en/1。7/ref/contrib/contenttypes /#generic-relations – dylrei 2015-02-23 23:10:33
作为第二个问题,您是否真的想在一个配方中设计特定数量的输入/输出,或者是否需要为每个配方设计许多输入/输出?输入/输出是否用于多个配方? – dylrei 2015-02-23 23:12:37
不要紧,你应该从提供的答案开始。它可能需要调整你的确切情况,但这是一个很好的开始。 – dylrei 2015-02-23 23:22:29