2008-11-17 24 views
7

Tengo algunas clases modelo con relaciones básicas de uno a muchos. Por ejemplo, un libro tiene muchas recetas, y cada receta tiene muchos ingredientes:Aplanamiento de la relación uno a muchos en 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) 

me gustaría una lista plana de todos los ingredientes en todas las recetas de un libro en particular. ¿Cuál es la mejor manera de expresar esto en Python?

Si yo estaba usando LINQ, podría escribir algo como esto:

var allIngredients = from recipe in book.Recipes 
        from ingredient in recipe.Ingredients 
        select ingredient; 

Respuesta

10

En realidad, parece que hay un mejor enfoque usando filtro:

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

Bueno, supongo que si quieres hacerlo de la manera más simple y de una sola línea, podrías hacerlo. ;) –

2

Para imprimir cada receta y sus ingredientes:

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 

Y si lo que desea es obtener una lista de todos ingrediente:

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, no estoy buscando exactamente para imprimir los ingredientes, pero reunirlas en una lista. Me estoy imaginando que probablemente haya un idioma aquí que me estoy perdiendo. –

+0

He actualizado la respuesta con lo que creo que estás buscando. –

Cuestiones relacionadas