2015-06-30 30 views
5

Bir prefetch queryset cadıyla bir django şablonu oluştururken gerçekten bir performans sorunu yaşıyorum (üretim ortamında ~ 1000 nesne/geliştirme ortamında ~ 200 nesne) ancak çok sayıda yuvalama düzeyine sahip.Django şablon oluşturma hızı

stories = Story.objects.select_related(
      'commande', 
      'commande__societe', 
      'commande__plateforme', 
      'client',).prefetch_related(
      Prefetch('crm_message_related', 
        queryset=Message.objects.select_related(
         'societe', 
         'plateforme', 
         'type_message').order_by('-date_received')), 
      Prefetch('commande__crm_feedback_related'), 
      Prefetch('commande__crm_guarantee_related'), 
      Prefetch('commande__soyouz_item_related', 
        queryset=Item.objects.select_related(
         'etat', 'produit', 'produit__produit_enhanced',)), 
      Prefetch('commande__tagged_items__tag'), 
      Prefetch('commande__soyouz_item_related__tagged_items__tag'), 
      Prefetch('commande__soyouz_item_related__soyouz_annulationclient_related'), 
      Prefetch('commande__soyouz_item_related__soyouz_achat_related'), 
      Prefetch('commande__soyouz_item_related__soyouz_achat_related__soyouz_receptionachat_related'), 
      Prefetch('commande__soyouz_item_related__soyouz_achat_related__soyouz_annulationachat_related'), 
      Prefetch('soyouz_action_related'), 
      Prefetch('soyouz_action_related__receptionmessage__message', 
        to_attr='receptionmessages', 
        queryset=Message.objects.order_by(
         '-date_received').select_related(
         'societe', 'type_message', 'plateforme')) 
     ).order_by(
      '-commande__date_commande', 
      '-date_created' 
     ).all().distinct() 

sorunsuz SQL çalıştırmak, konuyu şu değil: İşte

getirilmeyen olduğunu. benim şablon cadı O üretim ortamında sayfayı görüntülemek için yaklaşık 10 sn sürer öldürmekle

{% for story in stories %} 
    {% with items=story.commande.soyouz_item_related.all %} 
    {% for item in items %} 
     {% for tag in item.tagged_items.all %} 
      <button>{{ tag.tag }}</button> 
     {% endfor %} 
     {{ item.titre|safe|truncatechars:50 }} 
    {% endfor %} 
{% endfor %} 

olduğunu işlemek çalıştığınızda

konu

olduğunu. (Geliştirme ortamında) 200 verileriyle 3 döngüler için

name   Times Tot Time Queries Queries Time 
stories.html 1  2814,1 ms 0   0 ms 

3 saniye:

Ben gerçekten django-template-zamanlama (https://github.com/orf/django-debug-toolbar-template-timings) ve benim geliştirme ortamında profilli? Çok görünüyor.

Şablon oluşturma hızını iyileştirmek için herhangi bir fikir var mı?

Çok teşekkürler!

+0

"DEBUG = False" ile denediniz mi? Django'nun şablon dili, hızı için bilinmemektedir, ancak bu aşırı gibi görünmektedir ve ben-döngülerin özellikle yavaş olduğuna inanmıyorum.Sadece emin olmak için: 200 hikaye, etiket, toplam öğelerden mi bahsediyorsunuz? – knbk

+0

in dev: 200 hikaye - hikaye başına 1 öğe - 0 tag ürün kodu: 1000 hikaye - hikaye başına 1 veya 2 öğe - öğe başına 1 tag – Tigrou

+0

DEBUG = Yanlış üretim ortamında zaten ayarlanmış – Tigrou

cevap

0

Özel bir etiket kullanın ve çıktıyı şablonun dışında oluşturun. Bu, django şablon yükünden kaçınmaya yardımcı olacaktır.

5

Django şablon zamanlaması oluşturma süresinin 2,8 sn olduğunu bildirmesine rağmen, çoğu zaman karmaşık SQL sorgusunu yürütmede tüketildiğinden şüpheleniyorum. Django yılında

, QuerySets are evaluated lazily. Bu, Story.objects.select_related(...).distinct() bildirdiğiniz deyimin sorguyu veritabanında yürütmeyeceği anlamına gelir. SQL, later çalıştırılır. Şablonu oluşturmadan önce tüm kodu göndermediğinden, QuerySet'in işlemeden önce değerlendirilip değerlendirilmediğinden emin değilim.

{% for story in stories %} 

Bu durumda, o zaman belki süresini azaltabilir senin SQL iyileştirilmesi: Değilse şablonda stories yineleme zaman, infaz edilebilir.

stories = [story for story in stories] 

Bu yineleme oluşturma işlemi öncesinde yürütülen SQL alır: SQL yürütme şablonu oluşturma işlemi öncesinde bu ekleyerek suçlu olup olmadığını

kontrol edebilirsiniz. Bundan sonra, django-template-timing çok daha kısa bir oluşturma zamanı bildirirse, SQL'in problem olduğunu bilirsiniz. Jinja2 gibi

  1. bir daha fazla ölçülebilir şablon motoru kullanın: gerçekten bir şablon oluşturma performans sorunu ise

    , bazı alternatifler vardır. https://stackoverflow.com/a/26592207/954376:

  2. Şansı Django şablonla render performansını geliştirmek için oda var bulunmaktadır.
+0

En iyi çözümü bulduk : jinja + mümkün olduğunda paginate – chocobn69

İlgili konular