Джанго: Как подсчитать ValuesQuerySet?
Я пытаюсь получить count
работать на ValuesQuerySet
, Согласно документации Django
values = Model.objects.values()
вернет ValuesQuerySet
который является подклассом QuerySet
Returns a ValuesQuerySet — a QuerySet subclass that returns dictionaries when used as an
iterable, rather than model-instance objects
Это будет означать, что все методы QuerySet
должен работать на ValuesQuerySet
также.
Однако, когда я пытаюсь сделать это, я получаю исключение
values = Model.objects.values()
а потом где-то в моем коде
v_size = size_calc(values)
def size_calc(objects)
return objects.count()
File "/home/talha/ws/events.py", line
246, in size_calc
return objects.count()
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 336, in count
return self.query.get_count(using=self.db)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 401, in
get_count
number = obj.get_aggregation(using=using)[None]
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 367, in
get_aggregation
result = query.get_compiler(using).execute_sql(SINGLE)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 213, in
get_compiler
return connection.ops.compiler(self.compiler)(self, connection, using)
File "/usr/lib/python2.7/site-packages/django/db/backends/__init__.py", line 582, in
compiler
return getattr(self._cache, compiler_name)
AttributeError: 'module' object has no attribute 'SQLAggregateCompiler'
count
работает без проблем на нормальном QuerySets
.. Может ли это быть проблемой с драйверами бэкэнда?
Обновление: я не могу использовать len
после оценки Queryset
поскольку данные огромны и должны быть разрезаны перед оценкой.
Я использую Django с бэкэндом mongodb. Связанные пакеты
django==1.3.0
django-mongodb-engine==0.4.0
djangotoolbox==0.9.2
4 ответа
Единственный способ, которым я мог обойти эту проблему, не внося изменений в mongodb-engine
должен был получить счет, используя нормальный queryset
, Таким образом, чтобы получить счет, который я использовал
count = Model.objects.all().count()
и для данных, которые я хотел, я использовал
values = Model.objects.values('a', 'b')
Почему бы тебе просто не попробовать len(values)
, Это отлично работает
Ваша проблема вызвана из-за функций агрегации mongodb.Вы можете использовать `Model.objects.item_frequencies('field')или вы можете прочитать здесь.
Попробуй это:
query_list = list(query_set)
len = query_list.indexof(query_list[-1])
Этот метод ничем не похож на len
функция списка. Как вы, возможно, знаете len
использует цикл для вычисления длины, но вышеупомянутый метод использует хеширование.