在通用ListView上覆盖get_queryset methd时,QuerySet select_related不起作用

时间:2017-07-10 01:48:45

标签: django python-3.x django-views django-queryset

当覆盖通用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进行检查。

感谢任何帮助,谢谢。

埃里克

1 个答案:

答案 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')

感谢您的评论