Как устранить ошибку в sql декодировании аннотации в django - PullRequest
1 голос
/ 29 января 2020

Я работаю над django фреймворком с базой данных mangodb.

Операции CRUD работают нормально, но я сталкиваюсь с проблемой ошибки получения запроса аннотации:

djongo.sql2mongo.SQLDecodeError: FAILED SQL: SELECT "app_message"."type", SUM(CASE WHEN "app_message"."type" = %(0)s THEN %(1)s ELSE %(2)s END) AS "bot" FROM "app_message" GROUP BY "app_message"."type"  LIMIT 21
Params: ('Outbound', 1, 0)
Version: 1.2.38
Message.objects.values('type').\
            annotate(bot=Count(Case(When(type="Outbound", then='id'), default=Value(0),
                                    output_field=IntegerField()),
                               ))

Также пробовал версию 1.2.31, но не повезло.

Python версия: 3.6.1, Django версия: 2.2.7

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Это вы можете сделать:

from django.db.models import Q, Sum, IntegerField

Message.objects.values('type').annotate(
     bot=Sum(Case(When(type="Outbound", then=1), 
     default=0,output_field=IntegerField()))
)

Надеюсь, это поможет!

0 голосов
/ 29 января 2020

Считать таким образом не имеет смысла, так как Value(0) будет также учитываться как единое целое. Более того, вам не нужно фильтровать себя, Django имеет средства для выполнения фильтрации в статистической функции, используя параметр filter=… [Django -doc] :

from django.db.models import Count, Q

Message.objects.values('type').annotate(
    bot=Count('id'<b>, filter=Q(type='Outbound')</b>)
)
...