Acoplar la relación uno a muchos en Django
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;
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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow