Выравнивание отношений один-ко-многим в Джанго
Вопрос
У меня есть несколько модельных классов с базовыми отношениями «один ко многим». Например, в книге много рецептов, а в каждом рецепте много ингредиентов:
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)
Не связан с StackOverflow