2013-08-03 35 views
0

所以我們可以說我有這些模型在我的Django應用程序:Django的多對多通過模型實現

class Ingredient(models.Model): 
    name = models.CharField(max_length=100) 

    def __unicode__(self): 
     return self.name 

class Recipe(models.Model): 
    name = models.CharField(max_length=100) 
    ingredients = models.ManyToManyField(Ingredient, 
     through='RecipeIngredient') 

    def __unicode__(self): 
     return self.name 

class RecipeIngredient(models.Model): 
    recipe = models.ForeignKey(Recipe) 
    ingredient = models.ForeignKey(Ingredient) 
    quantity = models.DecimalField(max_digits=4, decimal_places=2) 
    unit = models.CharField(max_length=25, null=True, blank=True) 

    def __unicode__(self): 
     return self.ingredient.name 

現在我要訪問一個配方的成分(真的RecipeIngredients)。通過Django外殼:

>>> r = Recipe.objects.get(id=1) 
>>> ingredients = RecipeIngredients.objects.filter(recipe=r) 

這對我來說似乎是違反直覺和笨拙的。理想情況下,我希望能夠有一個食譜對象,並直接從它獲取RecipeIngredients。

是否有更優雅的模型實現?有什麼方法可以改進我現有的模型實現嗎?

回答

1

使用related_name,就像你有一個正常的ForeignKeyManyToManyField

class RecipeIngredients(models.Model): 
    recipe = models.ForeignKey(Recipe, related_name='ingredient_quantities') 

然後:

>>> r = Recipe.objects.get(id=1) 
>>> ingredients = r.ingredient_quantities.all() 
+0

我甚至不知道我可以訪問過'recipeingredients_set' X(似乎現在顯而易見...謝謝! – kevlar1818