如何在Django的DetailView中使用prefetch_related

时间:2015-04-03 08:05:37

标签: django django-models django-templates django-views django-orm

我想将prefetch_relatedDjango's DetailView一起使用。

型号:

class Customer(models.Model):
    name = models.CharField(
        verbose_name='customer name',
        max_length=100
    )
    # Other fields

class Packet(models.Model):
    customer = models.ForeignKey(
        Customer
    )
    # Other fields

class Credit(models.Model)   :
    customer = models.ForeignKey(
        Customer
    )
    # Other fields

查看:

class CustomerDetailsView(LoginRequiredMixin, DetailView):
    model = Customer
    http_method_names = ['get']
    template_name = 'detail_templates/customer_details.html'

模板:

{% for p in object.packet_set %}
    {{ do something }}
{% endif %}

{% for p in object.credit_set %}
    {{ do something }}
{% endif %}

尝试:

class CustomerDetailsView(LoginRequiredMixin, DetailView):
    model = Customer
    http_method_names = ['get']
    template_name = 'detail_templates/customer_details.html'

    def get_queryset(self):
        queryset = super(CustomerDetailsView, self).get_queryset()
        pk = self.kwargs.get(self.pk_url_kwarg, None)
        return queryset.filter(id=pk).prefetch_related('packet_set', 'credit_set')

debug_toolbar shows no improvement。 我如何prefetch_related packet and credit

1 个答案:

答案 0 :(得分:2)

prefetch_related()中使用DetailView是没有意义的。此视图使用get()加载单个主对象,而prefetch_related()可用于加载多个主对象的相关对象。