Свойства модели кэширования в Django - PullRequest
1 голос
/ 03 октября 2019

В моем приложении Django очень часто повторяется запрос, вызывающий for item in self.schemaitem_set.all(). Я чувствую, что этот код крайне неэффективен. Я ищу способ обналичить запрос. Ребята, вы знаете, как я мог бы улучшить приведенный ниже код?

@property
def gross(self):
    gross_sum = Decimal('0')
    for item in self.schemaitem_set.all():
        gross_sum += item.gross
    return gross_sum

@property
def net(self):
    net_sum = Decimal('0')
    for item in self.schemaitem_set.all():
        net_sum += item.net
    return net_sum

@property
def deposit(self):
    deposit_sum = Decimal('0')
    for item in self.schemaitem_set.all():
        deposit_sum += item.deposit
    return deposit_sum

@property
def service_cost(self):
    service_cost = Decimal('0')
    if self.net > Decimal('150'):
        pass
    else:
        service_cost += Decimal('9.99')
    return service_cost

@property
def service_cost_vat(self):
    service_cost_vat = Decimal('0')
    if self.net > Decimal('150'):
        pass
    else:
        service_cost_vat += Decimal(f'{9.99*0,19}')
    return service_cost_vat

@property
def vat(self):
    vat = Decimal('0')
    for item in self.schemaitem_set.all():
        vat += item.vat
    return vat

1 Ответ

1 голос
/ 03 октября 2019

Для этого можно использовать агрегаты :

from django.db.models import Sum

@property
def gross(self):  
    return self.schemaitem_set.all().aggregate(Sum('gross'))

Теперь вычисление выполняется на уровне базы данных, и запрашивается только сумма столбцов.

Если вы постоянно выполняете эти методы вместе в одном и том же шаблоне, вы можете свести их к одному запросу:

def get_aggregate_data(self):
   qs = self.schematem_set.all(
   ).aggregate(Sum('gross'), Sum('net'), Sum('deposit'), Sum('vat')) 
   qs.service_cost, qs.service_cost_vat = (Decimal('9.99'), Decimal(f'{9.99*0,19}')) if qs.net > Decimal('150') else (Decimal('0'), Decimal('0'))
   return qs

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

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