Django ORM: насколько подсчет в аннотации отличается от подсчета в наборе запросов? - PullRequest
0 голосов
/ 23 сентября 2019
qs = ...

qs = qs.annotate(v=Count('a', filter=Q(a__lt=5)))
a = qs.first().v
b = qs.filter(Q(a__lt=5)).count()

assert a == b  # error

Есть ли причина, по которой эти методы могут давать разные результаты?

1 Ответ

1 голос
/ 23 сентября 2019

Из документации о Count(expression, **kwargs):

Возвращает количество объектов, связанных с помощью предоставленного выражения

Итак Count специально предназначен для подсчета связанных объектов (через отношения FK или M2M) и не имеет большого смысла для любого другого столбца самой строки.В этом случае обычно возвращается 1 (может зависеть от того, какое значение будет возвращено вашей БД), поскольку всегда есть значение 1.

...