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
属性吗?
答案 0 :(得分:4)
Django 1.7添加了可以放入prefetch_related的Prefetch对象。它允许您指定应提供过滤的查询集。我目前在从列表中获取单个(最新)条目时遇到了一些问题,但在尝试获取所有相关条目时似乎工作得非常好。
您还可以结帐django-prefetch,这是this question的一部分,由于措辞差异很大,因此似乎与此问题不重复。
答案 1 :(得分:2)
以下代码将在2个查询中获取所有成分及其参数:
ingredients = Ingredients.objects.all().prefetch_related('ingredientparam_set')
然后,您可以访问您感兴趣的参数而无需进一步的数据库查询。