【问题标题】:Django model inherit from one of several modelsDjango 模型继承自多个模型之一
【发布时间】:2020-01-31 21:50:46
【问题描述】:

我是 Django 的新手,无法找出正确的模型继承方法。

假设我正在制作某种食物应用程序。然后我会有一个满足的模型,一个水果的模型,一个蔬菜的模型等等。

我的问题是:如何制作一个营养成分模型,它可以继承上述所有模型,但一次只能继承一个?例如苹果的营养成分应该只继承水果模型。

如果只有一种食物模型类型,我会使用 ForeignKey 来处理继承。我想当模型可以继承多个选项时,这不是一个选项。

我想将 on_delete=models.CASCADE 用于营养含量模型。因此请求继承。

任何建议将不胜感激。

【问题讨论】:

  • 所以你之前没有做过模型?
  • 我的经验有限。

标签: django django-models django-inheritance


【解决方案1】:

Python 类继承和 Django 模型 ForeignKey 关系是两个完全不同的东西。听起来你指的是后者。

不同食物类型之间的字段是否如此不同,以至于您实际上需要为每种食物使用不同的模型?最简单的方法是只为所有食物类型设置一个 Food 模型。

class Food(models.model):
    VEGETABLE = 'vegetable'
    MEAT = 'meat'
    FRUIT = 'fruit'
    TYPE_CHOICES = [
        (VEGETABLE, 'vegetable'),
        (MEAT, 'meat'),
        (FRUIT, 'fruit'),
    ]
    type = models.CharField(max_length=10, choices=TYPE_CHOICES)
    nutrition_content = models.OneToOneField('NutritionContent', on_delete=models.CASCADE)
    # additional fields

class NutritionContent(models.Model):
    # additional fields

如果您的字段在食物类型之间差异很大,以至于您需要为每种食物类型设置不同的模型,您可以将 Food 设置为所有子食物类型模型与其具有 OneToOneField 关系的父模型。然后 NutritionContent 模型仍然可以与 Food 链接。

class Food(models.model):
    nutrition_content = models.OneToOneField('NutritionContent', on_delete=models.CASCADE)
    # fields that apply to all foods

class Vegetable(models.Model):
   food = models.OneToOneField('Food', on_delete=models.CASCADE)
   # additional fields that only apply to vegetables

class Meat(models.Model):
   food = models.OneToOneField('Food', on_delete=models.CASCADE)
   # additional fields that only apply to meat

class Fruit(models.Model):
   food = models.OneToOneField('Food', on_delete=models.CASCADE)
   # additional fields that only apply to fruit

class NutritionContent(models.Model):
    # additional fields

【讨论】:

  • 感谢您的回答。看起来所有食物类型的一种模型是要走的路。
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多