2016-04-13 4 views
0

Ich möchte Daten in einer Tabelle anzeigen, in der eine Viele-zu-Eins-Beziehung zwischen meinen Spaltenwerten (Komponenten) und meinen Zeilen (Materialien) besteht. Zwischen diesen Spaltenwerten und den Spaltenüberschriften (ComponentTypes) besteht eine weitere Viele-zu-Eins-Beziehung. Im Moment habe ich so etwas wie dies meiner Meinung nach umgesetzt:Was ist die effizienteste Methode, um ein dünnes Dataset als Tabelle in Django anzuzeigen?

Reihen:

materials_list = Materials.objects.all() 

Spalten:

component_type_list = Components.objects.filter(material__in = materials_list).values("component__name") 

Festlegung der Werte für die Zeile in der Reihenfolge des Spaltentitels:

for material in materials: 
    component_list = [] 
    for component_type in component_type_list: 
     try: 
      component = material.components_set.filter(component__name = component_type['component__name'])[0].weight_pct 
     except: 
      component = 0 
     component_list.append(component) 
    material.component_list_for_table = component_list 

ich dann Materialien und component_type_list auf die Vorlage übergeben, wo ich t haben er folgt:

<table> 
    <thead> 
    <tr> 
     <th>Guru ID</th> 
     <th>Material</br>Code</th> 
    {% for component_type in component_type_list %} 
     <th>{{ component_type.component__name }}</th> 
    {% endfor %} 
    </tr> 
    </thead> 
    <tbody> 
{% for material in materials %} 
    <tr> 
     <th>{{ material.GURU_ID }}</th> 
     <th>{{ material.MATERIALCODE }}</th> 
     {% for component in material.component_list_for_table %} 
     <td>{{ component|floatformat }}%</td>  
     {% endfor %} 
    </tr> 
{% endfor %} 
    </tbody> 
</table> 

Selbst mit nur 50 Zeilen (potenziell ~ 100 Spalten) arbeitet dies extrem langsam. Gibt es einen effizienteren Weg?

Ich habe den Code bearbeitet, um es zu vereinfachen, damit es nicht perfekt sein kann.

Antwort

0

Meine 2 Cent:

  • Verwendung Django Debug Toolbar zu überprüfen, wie viele Fragen, die Sie haben und wie lange dauern sie. Sie erwähnen "das funktioniert extrem langsam", aber es ist gut, Daten zu haben.
  • haben Sie versucht, prefetch_related zu verwenden, um Abfragen einzuschränken?
  • Ich würde Python-Code (wie Sie) verwenden, um Daten in den Datensätzen zu reorganisieren, wenn das durch SQL zu kompliziert ist.

Vielleicht so etwas wie folgt aus:

materials_list = Materials.objects.prefetch_related('components_set').prefetch_related('components_set__type').all() 

for material in material_list: 
    component_list = [] 
    # your logic here - which should run fast thanks to the prefetches. 
    material.component_list = component_list 
Verwandte Themen