#python #django #django-models
Вопрос:
Я разрабатываю модели рецептов и ингредиентов.
models.py:
class Recipe(models.Model):
"""Recipe structure"""
author = models.ForeignKey(
User, on_delete=models.CASCADE
)
title = models.CharField(max_length=40, unique=True)
picture = models.ImageField(blank=True, null=True)
text = models.TextField(max_length=100, blank=True, null=True)
components = models.ManyToManyField('Component')
tag = MultiSelectField(max_length=10, choices=tags)
cooking_time = models.IntegerField(
validators=[MinValueValidator(1, 'Value cannot be lower than 1')]
)
slug = models.SlugField()
def __str__(self):
return self.title
class Meta:
db_table = 'recipes'
verbose_name = 'Рецепт'
verbose_name_plural = 'Рецепты'
class Component(models.Model):
"""Component structure"""
title = models.CharField(max_length=50, unique=True)
unit = models.CharField(max_length=10, choices=units)
def __str__(self):
return self.title
class Meta:
db_table = 'components'
verbose_name = 'Ингредиент'
verbose_name_plural = 'Ингредиенты'
class Component_quantity(models.Model):
"""Table linking quantity with recipe and component together"""
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
component = models.ForeignKey(Component, on_delete=models.CASCADE)
quantity = models.DecimalField(
max_digits=5,
decimal_places=1,
verbose_name='Количество',
validators=[MinValueValidator(1)]
)
class Meta:
db_table = 'quantity_and_recipe_linking_table'
unique_together = ('recipe', 'component')
verbose_name = 'Ингредиент в рецепте'
verbose_name_plural = 'Ингредиенты в рецепте'
Проблема заключается в том, чтобы связать рецепт и компонент в модели Component_quantity, чтобы в поле компонент можно было выбрать только те сущности, которые указаны в самом рецепте. Возможно ли это сделать?
Комментарии:
1.
Recipe.components
Поле следует использоватьComponent_quantity
в качестве сквозной таблицы. Не имеет смысла иметь два отношения «многие ко многим» между моделями
Ответ №1:
Я бы рекомендовал поместить поле количество непосредственно в компонентную модель. Другой способ сделать это-добавить внешний ключ количества в модель компонента, а затем удалить внешний ключ рецепта и компонента из модели Component_quantity.