Django 模型继承自多个模型之一
Django model inherit from one of several models
我是 Django 的新手,无法找出进行模型继承的正确方法。
假设我正在制作某种美食应用。然后我会有一个满足的模型,一个水果的模型,一个蔬菜的模型等等。
我的问题是:如何制作一个营养成分模型,它可以继承上述所有模型,但一次只能继承一个模型?比如苹果的营养成分只能继承水果模型。
如果只有一种食物模型类型,我会使用 ForeignKey 来处理继承。我想当有多个可供模型继承的选项时,这不是一个选项。
我想使用 on_delete=models.CASCADE 作为营养成分模型。因此请求继承。
如有任何建议,我们将不胜感激。
Python class继承和Django模型的ForeignKey关系是两个完全不同的东西。听起来你指的是后者。
不同食物类型之间的字段是否如此不同,以至于您实际上需要为每种食物使用不同的模型?最简单的方法是只为所有食物类型设置一个食物模型。
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 模型仍然可以 link with 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
我是 Django 的新手,无法找出进行模型继承的正确方法。
假设我正在制作某种美食应用。然后我会有一个满足的模型,一个水果的模型,一个蔬菜的模型等等。
我的问题是:如何制作一个营养成分模型,它可以继承上述所有模型,但一次只能继承一个模型?比如苹果的营养成分只能继承水果模型。
如果只有一种食物模型类型,我会使用 ForeignKey 来处理继承。我想当有多个可供模型继承的选项时,这不是一个选项。
我想使用 on_delete=models.CASCADE 作为营养成分模型。因此请求继承。
如有任何建议,我们将不胜感激。
Python class继承和Django模型的ForeignKey关系是两个完全不同的东西。听起来你指的是后者。
不同食物类型之间的字段是否如此不同,以至于您实际上需要为每种食物使用不同的模型?最简单的方法是只为所有食物类型设置一个食物模型。
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 模型仍然可以 link with 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