ManyToManyField вопрос - PullRequest
       5

ManyToManyField вопрос

1 голос
/ 07 июня 2010

Эй, ребята, я пишу простое приложение, которое регистрирует рецепты.

Я работаю над моими моделями и наткнулся на проблему

В моих моделях Dish должно быть много ингредиентов. Это не проблема, потому что я бы сделал что-то вроде этого

ingredients = models.ManyToManyfield(Ingredient)

Нет проблем, мое блюдо теперь может иметь много ингредиентов.

Однако проблема в том, что ингредиент должен поступать в разных количествах.

I.E 4 яйца, 7 столовых ложек сахара

Моя модель ингредиентов на данный момент очень проста

class Ingredient(models.Model):
    name = models.TextField(blank=False)
    slug = models.SlugField(blank=True)

Как бы я решил эту проблему? Какие поля мне нужно было бы добавить, нужно ли мне использовать атрибут 'through' на моем поле ManyToMany для решения этой проблемы?

1 Ответ

2 голосов
/ 07 июня 2010

Я думаю, что вы получили правильный ответ со сквозной таблицей (http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany)

Модель

class Recipe(models.Model):
    name = models.TextField(blank=False)
    ingredients = models.ManyToManyField(Ingredient, through='Components')

class Ingredient(models.Model):
    name = models.TextField(blank=False)
    slug = models.SlugField(blank=True)

class Components(models.Model):
    recipe = models.ForeignKey(Recipe)
    ingredient = models.ForeignKey(Ingredient)
    quantity = models.DecimalField()

Вы можете поместить единицу количества (грамм, килограмм, столовую ложку и т. Д.) На уровень ингредиентов, но я думаю, что это лучше на уровне ингредиентов (например, вы можете иметь 1 рецепт с 10 мл молока, а один с 1 л. .. Так что «разные» единицы для одного и того же ингредиента.

Создание данных

Под блюдом вы подразумеваете рецепт, верно? Если вы заглянули на предыдущую ссылку (http://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany),, то они дадут вам хороший пример (на основе битлз). В основном:

1.Создать рецепт:

cake=Recipe.objects.create(name="Simple Cake")

2.Создать несколько ингредиентов (если они еще не существуют из предыдущего рецепта;)):

egg = Ingredient.objects.create(name="Egg")
milk = Ingredient.objects.create(name="milk")

3.Создать отношения:

cake_ing1 = Components.objects.create(recipe=cake, ingredient=egg,quantity = 2)  
cake_ing2 = Components.objects.create(recipe=cake, ingredient=milk,quantity = 200)

и так далее. Плюс, теперь я совершенно уверен, что юнит должен перейти на уровень компонентов, с юнитом по умолчанию как «штука» (это будет для твоих яиц ...), и будет что-то вроде «мл» для молока.

Доступ к данным

Чтобы получить ингредиенты (Компоненты) рецепта, просто сделайте:

cake = Recipe.objects.get(name = "Simple Cake")
components_cake = Components.objects.get(recipe = cake)
...