Aplatissement de la relation un à plusieurs dans Django
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;
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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow