django-голосование в сочетании с пагинатором: объект TypeError типа 'generator' не имеет len()
ОБНОВЛЕНИЕ:
Все, что я пытаюсь сделать, это получить список объектов на основе их голосов и отправить его в шаблон. Если вы использовали django-голосование, пожалуйста, помогите мне разобраться в этом. Мне нужен список, потому что я передаю этот список в приложение paginator.
Должен ли я задать другой вопрос (и, возможно, закрыть этот вопрос)?
Я пытаюсь расположить все объекты в порядке их оценки, добавить их в список и отправить в шаблон, но получаю ошибки. Можете ли вы показать мне, как быстро получить мои объекты в порядке их голосования?
get_top()
Метод из менеджеров приложений django-голосования: связать метод с github:
https://github.com/brosner/django-voting/blob/master/voting/managers.py
Я получаю все комментарии в моем виде как:
comments_all = Vote.objects.get_top(Comment, 100, False)
"""URL param is latest, then sort by datetime
else sort by vote count, default"""
if sort == 'latest':
comments_all = Comment.objects.filter(book=book_id, active=True)\
.order_by('-created_datetime', '-modified_datetime')
else:
comments_all = Vote.objects.get_top(Comment, 100, False)
"""Pagination: if there is no page, set it to 1"""
comments_paginator = Paginator(comments_all, 20)
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
#pagination: get the pages.
try:
comments_page = comments_paginator.page(page)
except (EmptyPage, InvalidPage):
comments_page = comments_paginator.page(comments_paginator.num_pages)
Трассировка ошибок:
Traceback:
File "/Users/AJ/work/projects/virtual_environments/bottledink/lib/python2.6/site- packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/Users/AJ/work/projects/bottledink/../bottledink/main/views.py" in show_book
74. comments_page = comments_paginator.page(page)
File "/Users/AJ/work/projects/virtual_environments/bottledink/lib/python2.6/site-packages/django/core/paginator.py" in page
37. number = self.validate_number(number)
File "/Users/AJ/work/projects/virtual_environments/bottledink/lib/python2.6/site-packages/django/core/paginator.py" in validate_number
28. if number > self.num_pages:
File "/Users/AJ/work/projects/virtual_environments/bottledink/lib/python2.6/site-packages/django/core/paginator.py" in _get_num_pages
60. if self.count == 0 and not self.allow_empty_first_page:
File "/Users/AJ/work/projects/virtual_environments/bottledink/lib/python2.6/site-packages/django/core/paginator.py" in _get_count
53. self._count = len(self.object_list)
Exception Value: object of type 'generator' has no len()
ОБНОВЛЕНИЕ: я пытался сделать:
comments_all = list(Vote.objects.get_top(Comment, 100, False))
но это дает ошибку:
int() argument must be a string or a number, not 'tuple'
2 ответа
http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/"API агрегирования базы данных Django не работает с GenericRelation. Например, у вас может возникнуть желание попробовать что-то вроде"
Вы можете использовать https://github.com/coleifer/django-generic-aggregation
from django.contrib.comments.models import Comment
from django.db.models import Sum
from generic_aggregation import generic_annotate
from voting.models import Vote
#want might to filter on is_public and is_removed
top = generic_annotate(Comment.objects.all(), Vote.object, Sum('vote')).filter(active=True)
Стараться сделать:
comments_paginator = Paginator(list(comments_all), 20)