2008-11-17 8 views
7

J'ai quelques classes de modèles avec des relations un-à-plusieurs de base. Par exemple, un livre a de nombreuses recettes, et chaque recette a de nombreux ingrédients:Affaiblissement d'une relation un-à-plusieurs dans Django

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 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; 

Répondre

10

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

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

Eh bien, je suppose que si vous voulez le faire de la manière simple, en une ligne, vous pouvez le faire. ;) –

2

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 pour obtenir une liste de tous objets ingrédient:

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.

+0

Hm, je ne cherche pas exactement à imprimer les ingrédients, mais les recueillir dans une liste. J'imagine qu'il y a probablement un idiome ici qui me manque. –

+0

J'ai mis à jour la réponse avec ce que je pense que vous recherchez. –

Questions connexes