Выравнивание отношений один-ко-многим в Джанго

StackOverflow https://stackoverflow.com/questions/294712

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть несколько модельных классов с базовыми отношениями «один ко многим». Например, в книге много рецептов, а в каждом рецепте много ингредиентов:

class Book(models.Model):
    name = models.CharField(max_length=64)

class Recipe(models.Model):
    book = models.ForeignKey(Book)
    name = models.CharField(max_length=64)

class Ingredient(models.Model):
    text = models.CharField(max_length=128)
    recipe = models.ForeignKey(Recipe)

Я хотел бы получить список всех ингредиентов во всех рецептах из определенной книги. Какой лучший способ выразить это в Python?

Если бы я использовал LINQ, я мог бы написать что-то вроде этого:

var allIngredients = from recipe in book.Recipes
                     from ingredient in recipe.Ingredients
                     select ingredient;
Это было полезно?

Решение

На самом деле, похоже, есть лучший подход с использованием фильтра:

my_book = Book.objects.get(pk=1)
all_ingredients = Ingredient.objects.filter(recipe__book=my_book)

Другие советы

Чтобы напечатать каждый рецепт и его ингредиенты:

mybook = Book.objects.get(name="Jason's Cookbook")
for recipe in mybook.recipe_set.all():
    print recipe.name
    for ingredient in recipe.ingredients:
        print ingredient.text

И если вы просто хотите получить список всех объектов ингредиентов:

mybook = Book.objects.get(name="Jason's Cookbook")
ingredient_list = []
for recipe in mybook.recipe_set.all():
    for ingredient in recipe.ingredients:
        ingredient_list.append(ingredient)

Документация .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top