Django модель наследуется от одной из нескольких моделей - PullRequest
0 голосов
/ 01 февраля 2020

Я новичок в Django и не могу понять, как сделать наследование модели правильным.

Давайте предположим, что я делаю какое-то приложение для еды. Тогда у меня была бы модель для встречи, модель для фруктов, модель для овощей и т. Д.

Мой вопрос: как я могу создать модель содержания питания, которая может наследоваться от всех вышеперечисленных моделей? но только по одному за раз? Например, содержание яблок в питании должно наследоваться только от фруктовой модели.

Если бы существовал только один тип пищевой модели, я бы использовал ForeignKey для обработки наследования. Я думаю, что это не вариант, когда есть несколько вариантов наследования моделей.

Я хотел бы использовать on_delete = models.CASCADE для модели содержания питания. Отсюда просьба о наследовании.

Любые предложения будут оценены.

1 Ответ

1 голос
/ 01 февраля 2020

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...