2016-06-22 3 views
0

Я использовал связанное имя в шаблоне Django, чтобы посмотреть запись внешнего ключа и вызвать метод подсчета. Поскольку у меня так много записи «Главная», цикл for внутри шаблона создает слишком много запросов к базе данных. Если есть простой способ уменьшить количество запросов к базе данных? См. Ниже мою настройку.Django - уменьшить количество запросов в 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

Вы можете аннотировать поля со значением счета. Например, на https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#combining-multiple-aggregations –

ответ

2

Вы можете использовать annotations, чтобы сделать эту логику в одном запросе:

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)) 

Затем в шаблоне:

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

(Edit: добавлена ​​distinct)

+0

Это может дать тот же результат для всех полей. Это произойдет, добавьте 'distinct = True' в вызовы' Count() '. –

+0

Могу ли я все-таки избежать {{main.name}} внутри forloop? Кроме того, вы можете показать, как использовать «distinct = True» в коде. Благодаря! – user1187968

Смежные вопросы