Pergunta

Eu tenho algumas classes de modelos com relacionamentos básicos de um para muitos. Por exemplo, um livro tem muitas receitas e cada receita tem muitos ingredientes:

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)

Eu gostaria de uma lista plana de todos os ingredientes em todas as receitas de um livro específico. Qual é a melhor maneira de expressar isso em Python?

Se eu estivesse usando o LINQ, posso escrever algo assim:

var allIngredients = from recipe in book.Recipes
                     from ingredient in recipe.Ingredients
                     select ingredient;
Foi útil?

Solução

Na verdade, parece que há uma abordagem melhor usando o filtro:

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

Outras dicas

Para imprimir cada receita e seus 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

E se você deseja apenas obter uma lista de todos os objetos de 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)

Documentação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top