Проблема организации модели Django

#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.