2016-06-22 6 views
0

Ich verwandte Name in einer Django Vorlage, um den Fremdschlüssel Datensatz aussehen, und rufen Sie die Count-Methode. Da ich so viele "Main" -Aufzeichnungen habe, erzeugt die for-Schleife in der Vorlage zu viele Abfragen an die Datenbank. Gibt es einen einfachen Weg für mich, die Anzahl der Anfragen an die Datenbank zu reduzieren? Bitte sehen Sie unten für meine Einrichtung.Django - reduzieren Sie die Anzahl der Abfragen in ORM

# models.py 
class Main(models.Model): 
    name = models.CharField(_('Name'), max_length=255) 

class Sub1(models.Model): 
    main = models.ForeignKey(Main, on_delete=models.CASCADE) 
    name = models.CharField(_('Name'), max_length=255) 

class Sub2(models.Model): 
    main = models.ForeignKey(Main, on_delete=models.CASCADE) 
    name = models.CharField(_('Name'), max_length=255) 

class Sub3(models.Model): 
    main = models.ForeignKey(Main, on_delete=models.CASCADE) 
    name = models.CharField(_('Name'), max_length=255)  

# views.py 
def get_main(request): 
    main_list = Main.objects.all() 
    ... 

# template 
{% for main in main_list %}  
     {{main.sub1_set.count}} 
     {{main.sub2_set.count}} 
     {{main.sub3_set.count}} 
{% endfor %} 
+0

können Sie Felder mit dem Zählwert annotieren. Es gibt ein Beispiel unter https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#combining-multiple-aggregations –

Antwort

2

können Sie annotations verwenden diese Logik alle Abfrage in einem tun:

from django.db.models import Count 

def get_main(request): 
    main_list = Main.objects.all().annotate(sub1_count=Count('sub1', distinct=True), 
              sub2_count=Count('sub2', distinct=True), 
              sub3_count=Count('sub3', distinct=True)) 

Dann in der Vorlage:

{% for main in main_list %}  
    {{ main.sub1_count }} 
    {{ main.sub2_count }} 
    {{ main.sub3_count }} 
{% endfor %} 

(Edit: hinzugefügt distinct)

+0

Dies könnte das gleiche Ergebnis für alle Felder ergeben. Wenn das passiert, füge 'distinct = True' zu ​​den' Count() 'Aufrufen hinzu. –

+0

kann ich dann noch {{main.name}} im Forloop aufrufen? Können Sie auch zeigen, wie "distinct = True" im Code verwendet wird? Vielen Dank! – user1187968

Verwandte Themen