Модель Django наследуется от одной из нескольких моделей

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

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

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

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

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

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


person Tola    schedule 31.01.2020    source источник
comment
Значит, вы раньше не занимались моделями?   -  person ilyas Jumadurdyew    schedule 01.02.2020
comment
У меня ограниченный опыт.   -  person Tola    schedule 02.02.2020


Ответы (1)


Наследование классов Python и отношения ForeignKey модели Django — это две совершенно разные вещи. Похоже, вы имеете в виду последнее.

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

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
person John Meinken    schedule 31.01.2020
comment
Спасибо за Ваш ответ. Похоже, что одна модель для всех типов продуктов питания — это то, что нужно. - person Tola; 02.02.2020