Abflachung von Eins-zu-Viele-Beziehung in Django
Frage
Ich habe ein paar Modellklassen mit grundlegenden Eins-zu-Viele-Beziehungen. Zum Beispiel hat ein Buch viele Rezepte und jedes Rezept hat viele Zutaten:
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 hätte gerne eine flache Liste aller Zutaten in allen Rezepten eines bestimmten Buches. Was ist der beste Weg, dies in Python auszudrücken?
Wenn ich Linq verwendet habe, könnte ich so etwas schreiben:
var allIngredients = from recipe in book.Recipes
from ingredient in recipe.Ingredients
select ingredient;
Lösung
Eigentlich sieht es so aus, als ob es einen besseren Ansatz mit Filter gibt:
my_book = Book.objects.get(pk=1)
all_ingredients = Ingredient.objects.filter(recipe__book=my_book)
Andere Tipps
So drucken Sie jedes Rezept und seine Zutaten:
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 nur eine Liste aller Zutatenobjekte erhalten möchten:
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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow