2008-11-17 9 views
7

Ich habe ein paar Modellklassen mit grundlegenden Eins-zu-Viele-Beziehungen. Zum Beispiel hat ein Buch viele Rezepte, und jedes Rezept hat viele Zutaten:Abflachung einer Eins-zu-viele-Beziehung in 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) 

ich in allen Rezepten aus einem bestimmten Buch eine einfache Liste aller Zutaten möchten. Was ist der beste Weg, dies in Python auszudrücken?

Wenn ich LINQ wurde mit, könnte ich so etwas schreiben:

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

Antwort

10

Eigentlich sieht es aus wie es ein besserer Ansatz Filter:

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

Nun, ich nehme an, wenn Sie es in der einfachen, einzeiligen Art tun möchten, könnten Sie dies tun. ;) –

2

Um jedes Rezept und seine Bestandteile zu drucken:

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 

Und wenn Sie wollen einfach nur eine Liste aller erhalten Bestandteil Objekte:

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, ich bin nicht auf der Suche genau die Zutaten zu drucken, aber sie in eine Liste zu sammeln. Ich stelle mir vor, dass es hier wahrscheinlich ein Idiom gibt, das ich vermisse. –

+0

Ich habe die Antwort mit dem, was ich denke, auf den neuesten Stand gebracht. –