Django l oop без l oop с использованием orm - PullRequest
1 голос
/ 25 мая 2020

В следующем коде я конвертирую date_no в день недели. Поэтому мне нужно l oop 7 раз для каждого дня. И запрос выполняется 7 раз. Но я хочу изменить этот код так, чтобы не было l oop и запрос для выполнения - только один.

        day_wise = {}
        for date_no in range(1,7):
            # Total 7 queryies 
             BusinessShareInfo_result = BusinessShareInfo.objects.filter(Date__week_day=date_no).all()
             day_wise[calendar.day_name[date_no]] = {'Average':0,'Maximum':0,'Minimum':0 }
             data = BusinessShareInfo_result.aggregate(Avg('Turnover'), Max('Turnover'), Min('Turnover') )
             day_wise[calendar.day_name[date_no]]['Average'] = data['Turnover__avg']
             day_wise[calendar.day_name[date_no]]['Maximum'] = data['Turnover__max']
             day_wise[calendar.day_name[date_no]]['Minimum'] = data['Turnover__min']

Я просто хочу, чтобы функциональность была такой же, но без l oop.

1 Ответ

1 голос
/ 25 мая 2020

Даже если вы не пишете l oop, вы все равно делаете циклы, например, для выборки из базы данных. Этот цикл не так уж и неэффективен. Что является неэффективным, так это выполнение семи запросов, потому что выполнение запроса, независимо от того, что это за запрос, уже само по себе является дорогостоящим.

Вы можете использовать ExtractWeekDay выражение [Django -doc] , чтобы уменьшить количество запросов до один :

from django.db.models.functions import <b>ExtractWeekDay</b>

qs = BusinessShareInfo.objects.values(
    <b>week_day=ExtractWeekDay('Date')</b>
).annotate(
    Average=Avg('Turnover')
    Max=Max('Turnover')
    Min=Min('Turnover')
)

result = {
    calendar.day_name[r['week_day']]: {
        'Average': r['Average'],
        'Max': r['Max'],
        'Min': r['Min'],
    }
    for r in qs
}

Примечание : обычно имена полей в модели Django записываются в snake_case , а не в PerlCase , поэтому должно быть: date вместо Date.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...