Джанго: Как подсчитать 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 использует цикл для вычисления длины, но вышеупомянутый метод использует хеширование.

Другие вопросы по тегам