0

假设我的 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)

这对我来说似乎违反直觉和笨拙。理想情况下,我希望能够拥有一个 Recipe 对象并直接从中获取 RecipeIngredients。

我的模型有更优雅的实现吗?有什么方法可以改进我现有的模型实现?

4

1 回答 1

1

使用related_name,就像使用普通的ForeignKeyor一样ManyToManyField

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

接着:

>>> r = Recipe.objects.get(id=1)
>>> ingredients = r.ingredient_quantities.all()
于 2013-08-03T21:24:54.653 回答