Achatando um-para-muitos relacionamento no Django

votos
7

Eu tenho algumas classes de modelo com relações básicas 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 simples de todos os ingredientes em todas as receitas de um livro particular. Qual é a melhor maneira de expressar isso em Python?

Se eu estava usando LINQ, eu poderia escrever algo como isto:

var allIngredients = from recipe in book.Recipes
                     from ingredient in recipe.Ingredients
                     select ingredient;
Publicado 17/11/2008 em 02:47
fonte usuário
Em outras línguas...                            


2 respostas

votos
10

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

my_book = Book.objects.get(pk=1)
all_ingredients = Ingredient.objects.filter(recipe__book=my_book)
Respondeu 17/11/2008 em 03:00
fonte usuário

votos
2

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ê quiser apenas para obter uma lista de todos os objetos de ingredientes:

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 .

Respondeu 17/11/2008 em 02:52
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more