Question

J'ai quelques classes modèles avec des relations de base un à plusieurs. Par exemple, un livre contient de nombreuses recettes et chaque recette contient de nombreux ingrédients:

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)

Je voudrais une liste plate de tous les ingrédients dans toutes les recettes d'un livre en particulier. Quelle est la meilleure façon d’exprimer cela en Python?

Si j'utilisais LINQ, je pourrais écrire quelque chose comme ceci:

var allIngredients = from recipe in book.Recipes
                     from ingredient in recipe.Ingredients
                     select ingredient;
Était-ce utile?

La solution

En fait, il semble qu'il existe une meilleure approche en utilisant un filtre:

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

Autres conseils

Pour imprimer chaque recette et ses ingrédients:

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

Et si vous voulez juste obtenir une liste de tous les objets d'ingrédients:

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)

Documentation .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top