2012-06-17 79 views
3

models.py:Django的prefetch_related與過濾

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) 

我需要parametrs獲取所有成分爲Establishment。首先我獲取Ingredients.objects.all()並使用所有參數,如Ingredients.objects.all()[0].est_param(establishment).active。我如何使用django 1.4 prefetch_related來減少sql查詢?可能是我可以使用其他方式來存儲個人Establishment屬性Ingredient

+0

可能的重複[Filter on prefetch \ _related in Django](http://stackoverflow.com/questions/10915319/filter-on-prefetch-related-in-django) – akaihola

回答

2

下面的代碼將獲取所有的成分和它們的參數在2個查詢:

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

然後,您可以訪問你感興趣的參數,而進一步的數據庫查詢。

+0

該查詢將獲取所有機構的所有參數,但我只需要一個機構(例如爲Establishment.objects.get(id = 1)) –

+2

就我所知,您只能用'prefetch_related'選擇整套參數,而不是子集。你可以忽略你不感興趣的參數。做一個數據庫查詢返回比你需要的更多的結果,比做許多數據庫查詢返回一個結果更有效率。 – Nathan

+0

如果成分列表大於Estabslishments,那麼'Ingredients.objects.all()。prefetch_related('ingredientparam_set')'是很好的解決方案。但是,如果成分列表小於Estabslihments,那麼更好地做一些查詢 –

4

Django 1.7將Prefetch對象添加到prefetch_related中。它允許你指定一個應該提供過濾的查詢集。我目前在從列表中獲取單數(最新)條目時遇到了一些問題,但在嘗試獲取所有相關條目時似乎工作得很好。

您也可以結算django-prefetch這是this question的一部分,這似乎不是這個問題的重複,因爲措辭大不相同。