4

模型.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吗?

4

2 回答 2

4

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

您还可以签出 django-prefetch,它是这个问题的一部分,由于措辞大不相同,它似乎与这个问题没有重复。

于 2014-06-22T19:32:03.127 回答
3

The following code would fetch all the ingredients and their parameters in 2 queries:

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

You could then access the parameters you're interested in without further database queries.

于 2012-06-18T02:44:21.813 回答