Методы Count и Q модели Django выдают ошибку типа

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

my_model.objects.aggregate(Type1=Count('pk', filter=Q(db_field=1)),Type2=Count('pk', filter=Q(db_field=2)),Type3=Count('pk', filter=Q(db_field=3)),Type4=Count('pk', filter=Q(db_field=4)),Type5=Count('pk', filter=Q(db_field=5)))

Вот код, который я написал для тестирования.

from django.db.models import (Count, Q)

field = field_values # (it's tuple and read from input)
aggregate_query = ''
if field != None:
   for j in field:
   aggregate_query += f"{j[1]}={Count}('pk', filter={Q}(db_field={j[0]})),"

my_model.objects.aggregate(aggregate_query[:-1])

Агрегатный запрос генерируется правильно и получает результаты, когда я оцениваю на консоли python. Но когда я выполняю этот код, он выдает следующую ошибку.

QuerySet.aggregate() received non-expression(s): 
Type1=<class 'django.db.models.aggregates.Count'>('pk', filter=<class 'django.db.models.query_utils.Q'>(db_field=1)),
Type2=<class 'django.db.models.aggregates.Count'>('pk', filter=<class 'django.db.models.query_utils.Q'>(db_field=2)),
Type3=<class 'django.db.models.aggregates.Count'>('pk', filter=<class 'django.db.models.query_utils.Q'>(db_field=3)),
Type4=<class 'django.db.models.aggregates.Count'>('pk', filter=<class 'django.db.models.query_utils.Q'>(db_field=4)),
Type5=<class 'django.db.models.aggregates.Count'>('pk', filter=<class 'django.db.models.query_utils.Q'>(db_field=5)).

Может ли кто-нибудь помочь мне в этом.

Проблема в том, что f"{j[1]}={Count}('pk', filter={Q}(db_field={j[0]}))," - это строка, а вы не можете делать запросы со строками.

Вы можете построить dict с помощью comprehension и затем использовать его для запроса:

from django.db.models import (Count, Q)

field = field_values
aggregate_query = {j[1]: Count('pk', filter=Q(db_field=j[0])) for j in field} if j != None else {}
my_model.objects.aggregate(**aggregate_query)
Вернуться на верх