2017-07-10 41 views
0

當覆蓋在通用ListViewget_queryset法,select_related()方法,沒有對queryset任何影響,對模板循環將n + 1次的SQL調用不工作:查詢集select_related覆蓋上通用的ListView get_queryset收作方法初探時

models.py:

class Bulding(models.Model): 
    name = models.Charfield(max_length=100) 

    def __str__(self): 
     return self.name 

    def get_absolute_url(self): 
     return reverse('properties:building_detail', args=[str(self.ph.pk), str(self.id)])  ... 


class Property(models.Model): 
    building = models.ForeignKey(Building) 

    def get_absolute_url(self): 
     return reverse('properties:property_detail', args=[str(self.ph.pk), str(self.id)]) 

views.py

class PropertyListView(LoginRequiredMixin, PHViewMixin, ListView): 
    model = Property 

    def get_queryset(self): 
     return super().get_queryset().filter(ph=self.kwargs['some_kw']).select_related('building') 

property_list.html:

... 
{% for p in object_list %} 
     <tr> 
     <td>{{ p.building }}</td><td><a href="{{ p.get_absolute_url }}">{{ p.name }}</a></td>>...</td> 
     </tr> 
    {% endfor %} 
... 

如果我刪除{{p.building}}我得到3次SQL調用,和47它是現在,隨着Django的調試工具欄裏檢查方式。

任何幫助表示讚賞,謝謝。

埃裏克

+1

什麼是你打算使用select_related()方法? select_related()方法是在具有FK關係時使用一個查詢一次檢索所有內容的方式。 – Jayground

+0

的確如此,但是當訪問Building大廈外鍵 –

+0

時,您是否可以嘗試使用select_related('building__name')來替代每個Property對象的循環中的新數據庫調用? – Jayground

回答

0

我需要包括在select_related方法調用的外鍵來PH因爲它是在get_absolute_url方法應用於:

def get_queryset(self): 
     return Property.objects.filter(ph=self.kwargs['ph_pk']).select_related('building', 'ph') 

感謝您的意見