Domanda

Ho alcune classi modello con relazioni uno-a-molti di base. Ad esempio, un libro ha molte ricette e ogni ricetta ha molti ingredienti:

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)

Vorrei un elenco semplice di tutti gli ingredienti di tutte le ricette di un determinato libro. Qual è il modo migliore per esprimerlo in Python?

Se stavo usando LINQ, potrei scrivere qualcosa del genere:

var allIngredients = from recipe in book.Recipes
                     from ingredient in recipe.Ingredients
                     select ingredient;
È stato utile?

Soluzione

In realtà, sembra che ci sia un approccio migliore usando il filtro:

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

Altri suggerimenti

Per stampare ogni ricetta e i suoi ingredienti:

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

E se vuoi solo ottenere un elenco di tutti gli oggetti 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)

Documentazione .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top