django prefetch_related with filter

时间:2012-06-17 17:43:09

标签: django django-orm

models.py:

class Ingredient(models.Model):
    _est_param = None

    param = models.ManyToManyField(Establishment, blank=True, null=True, related_name='+', through='IngredientParam')

    def est_param(self, establishment):
        if not self._est_param:
            self._est_param, created = self.ingredientparam_set\
                .get_or_create(establishment=establishment)
        return self._est_param

class IngredientParam(models.Model):
    #ingredient params
    active = models.BooleanField(default=False)
    ingredient = models.ForeignKey(Ingredient)
    establishment = models.ForeignKey(Establishment)

我需要使用Establishment的参数获取所有成分。首先,我获取Ingredients.objects.all()并使用Ingredients.objects.all()[0].est_param(establishment).active之类的所有参数。我如何使用django 1.4 prefetch_related来减少sql查询?我可以使用其他方式存储Establishment的个人Ingredient属性吗?

2 个答案:

答案 0 :(得分:4)

Django 1.7添加了可以放入prefetch_related的Prefetch对象。它允许您指定应提供过滤的查询集。我目前在从列表中获取单个(最新)条目时遇到了一些问题,但在尝试获取所有相关条目时似乎工作得非常好。

您还可以结帐django-prefetch,这是this question的一部分,由于措辞差异很大,因此似乎与此问题不重复。

答案 1 :(得分:2)

以下代码将在2个查询中获取所有成分及其参数:

ingredients = Ingredients.objects.all().prefetch_related('ingredientparam_set')

然后,您可以访问您感兴趣的参数而无需进一步的数据库查询。