Apontando o relacionamento um para muitos em Django
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;
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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow