Задать вопрос
@smf002

Как правильно сделать связь manytomany?

Доброго времени суток. Есть пара моделей, ну например, описывающих рецепт пиццы. В каждую из пицц входит несколько ингредиентов. Для каждой из пицц количество определенного ингредиента может быть разное, например в пиццу 1 добавляем 100 грамм ингредиента перец, а в пиццу 2 всего 50 грамм того же ингредиента перец. Как правильно это сделать в моделях?

class Ingridient(models.Model):
    ingridient_name = models.CharField(u'Название ингридиента', max_length=255)
    
class Pizza(models.Model):
    pizza_name = models.CharField(u'Название пиццы', max_length=255)
    ingridients = models.ManyToManyField(Ingridient)
  • Вопрос задан
  • 181 просмотр
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@deliro
Т.к. M2M поле - это сахар в джанге, может быть неочевидно, что в БД она представляется двумя полями с уникальным индексом на оба поля. FK на одну модель и FK на другую модель. Добавочные поля в M2M указать нельзя, поэтому нужно сделать что-то вроде такого:

class Ingredient(models.Model):
    name = models.CharField(u'Название ингр_е_диента', max_length=255)
    
class Pizza(models.Model):
    name = models.CharField(u'Название пиццы', max_length=255)
    ingredients = models.ManyToManyField(Ingredient, through='PizzaIngredient')

class PizzaIngredient(models.Model):
    pizza = models.ForeignKey(Pizza)
    ingredient = models.ForeignKey(Ingredient)
    quantity = models.DecimalField(max_digits=9, decimal_places=2)
    unit = models.CharField(max_length=30)  # Единица измерения (граммы, ложки). Можно выделить в отдельную таблицу, если надо

    class Meta:
        unique_together = (('pizza', 'ingredient'),)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
winordie
@winordie
Лучшая документация -- исходники
fox_12
@fox_12 Куратор тега Django
Расставляю биты, управляю заряженными частицами
К примеру добавить модель Recipe

class Recipe(models.Model):
    ingridient = models.ForeignKey(Ingridient)
    quantity = models.DecimalField(...)


Тогда Pizza

class Pizza(models.Model):
    pizza_name = models.CharField(u'Название пиццы', max_length=255)
    component = models.ManyToManyField(Recipe)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы