Аннотация Django - программный выбор агрегатора - PullRequest
0 голосов
/ 26 ноября 2011

Я хотел бы иметь возможность программно решать, какой агрегатор использовать в функции аннотации django. То есть, с учетом утверждения, подобного следующему ...

partsPerMachine = Machine.objects.annotate(num_parts=Count('parts'))

... Я бы хотел во время выполнения определить, какой агрегатор использовать. Я мог бы суммировать / считать / усреднять / т. Д. parts, и я не буду знать, какой из них раньше.

Я не совсем понимаю магию питона, которую авторы django использовали для создания этого синтаксиса. Если бы это был просто случай именованных параметров, я мог бы использовать синтаксис Python ** для передачи словаря параметров. Но это, кажется, что-то еще ...

1 Ответ

4 голосов
/ 26 ноября 2011

Агрегаторы - это просто классы Python. Один из простых способов выбрать нужный агрегатор во время выполнения - поместить их в словарь, а затем выбрать нужный агрегатор по ключу:

from django.db.models import Count, Sum, Avg

aggregators = {
    'count': Count,
    'sum': Sum,
    'avg': Avg
}

my_aggregator = aggregators[my_key]
partsPerMachine = Machine.objects.annotate(num_parts=my_aggregator('parts'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...