【问题标题】:django inheritance hurts my braindjango继承伤害了我的大脑
【发布时间】:2012-09-02 00:06:00
【问题描述】:

我正在制作一个啤酒网站,但我被困住了。我需要一个能与许多不同成分相关的食谱。有没有办法创建一个模型“成分”,并继承许多不同的模型:“啤酒花”、“谷物”等。我想这样做,所以我有我的配方和成分之间的关​​系,我没有创建 100 种不同的关系来涵盖每种成分。

这可能吗?

【问题讨论】:

  • 你是说你想要一个名为 Hop 的模型,一个名为 Grain 的模型,等等?难道你不想有一个成分类型或类似的字段吗?
  • 一般来说,只有当你需要不同的代码来处理它时,你才应该有一个单独的模型。啤酒花和谷物之间不太可能是这种情况,将它们视为两种成分会更简单(用ingredient_type 字段区分它们)
  • 他们确实有不同的领域,例如我想要啤酒花的酸度,我想要谷物的糖潜力

标签: django django-models django-inheritance


【解决方案1】:

尽管在大多数情况下我个人建议不要这样做,因为表继承在 Django 中是一种痛苦(恕我直言)。

你可以这样做:

class Recipe(models.Model):
    name = models.CharField()

class Ingredient(models.Model):
    name = models.CharField()
    recipes = models.ManyToManyField(Recipe, related_name='%(app_label)s_%(class)s')

class Hop(Ingredient):
    pass

class Grain(Ingredient):
    pass

【讨论】:

  • 这听起来确实很痛苦,但是为所有 100 种具有不同参数的不同类型指定 hop_additions、grain_additions 等的替代方法听起来很混乱。我还有其他选择吗?
  • 替代方案是 David Robinson 指定的,使用常见的成分模型并简单地指定类型。查询这样的东西可能会很痛苦,因为您有很多不同的模型要单独查询。
  • 再澄清一下,如果我有两个使用成分的模型,例如配方和原木,该怎么办?有没有办法设置我的 manytomany 来处理多个模型?
  • @user1104922:有两种方式,通用外键和表继承。两者都应该作为最后的手段恕我直言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多