2008-11-17 17 views
7

में संबंध मैं बुनियादी एक-से-कई रिश्तों के साथ कुछ मॉडल वर्गों की है। उदाहरण के लिए, एक किताब कई व्यंजनों हैं, और प्रत्येक नुस्खा कई सामग्री है:सपाट एक-से-कई Django

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) 

मैं एक विशेष पुस्तक से सभी व्यंजनों में सभी अवयवों का एक फ्लैट सूची चाहते हैं। अजगर में इस व्यक्त करने के लिए सबसे अच्छा तरीका क्या है?

var allIngredients = from recipe in book.Recipes 
        from ingredient in recipe.Ingredients 
        select ingredient; 

उत्तर

10

वास्तव में, ऐसा लगता है कि एक बेहतर दृष्टिकोण का उपयोग कर फिल्टर वहाँ की तरह:

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

खैर मुझे लगता है। ;) –

2

प्रत्येक नुस्खा है और इसकी सामग्री मुद्रित करने के लिए:

अगर मैं LINQ उपयोग कर रहा था, मैं कुछ इस तरह लिख सकते हैं

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 

और तुम बस सभी की एक सूची प्राप्त करना चाहते हैं घटक वस्तुओं:

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) 

Documentation

+0

हम्म, मैं वास्तव में सामग्री मुद्रित है, लेकिन उन्हें एक सूची में इकट्ठा करने के लिए नहीं देख रहा हूँ। मैं वहाँ शायद यहाँ एक मुहावरा है कि मैं याद कर रहा हूँ है की कल्पना कर रहा हूँ। –

+0

मैं मैं क्या लगता है कि आप के बाद कर रहे हैं के साथ जवाब नवीनीकृत किया है। यदि आप सरल, जिस तरह से आप ऐसा कर सकता है की एक पंक्ति का वस्तु के रूप में करना चाहते हैं –