1

我想使用prefetch_relatedDjango's DetailView如何使用prefetch_related和Django的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

回答

2

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

+0

所以他们是一种优化模板代码的方法....我在这里发现了这个http://w3facility.org/question/django-prefetch_related-on-generic-view-detailview/ – 2015-04-03 08:23:57

+0

你的代码链接有几个错误,并没有优化任何东西。在ListView中使用'prefetch_related()'是一个合理的意图,但不要在'DetailView'中做这件事。 – catavaran 2015-04-03 08:40:17

+0

明白了......谢谢 – 2015-04-03 09:38:18

相关问题