当覆盖通用get_queryset
上的ListView
方法时,select_related()
方法对queryset
没有任何影响,在模板上进行n + 1次sql调用循环:
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-debug-toolbar进行检查。
感谢任何帮助,谢谢。
埃里克
答案 0 :(得分:0)
我需要在PH
方法调用中将外键添加到select_related
,因为它在get_absolute_url
方法中使用:
def get_queryset(self):
return Property.objects.filter(ph=self.kwargs['ph_pk']).select_related('building', 'ph')
感谢您的评论