Pregunta

Tengo algunas clases de modelos con relaciones básicas de uno a muchos. Por ejemplo, un libro tiene muchas recetas, y cada receta tiene muchos 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)

Me gustaría una lista plana de todos los ingredientes en todas las recetas de un libro en particular. ¿Cuál es la mejor manera de expresar esto en Python?

Si estaba usando LINQ, podría escribir algo como esto:

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

Solución

En realidad, parece que hay un mejor enfoque usando el filtro:

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

Otros consejos

Para imprimir cada receta y sus 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

Y si solo desea obtener una lista de todos los objetos 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)

Documentación .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top