В Django, используя универсальный класс списка, как я могу получить N из object_list из того же типа поля - PullRequest
0 голосов
/ 30 декабря 2011

У меня есть модель, которая собирает лайки, которые пользователи выбирают в книгах.

Итак, у каждой записи есть user_id, like_id и book_id.

Я хочу URL-адрес, похожий на:

(?P<top_num>\d+)/likes/

Который будет направлен на представление, которое делает что-то вроде этого:

class TopLikes(ListView):
    """ Get all the archived projects """

    queryset = Like.objects.filter(display=True)
    template_name = "books/TopLikes.html"
    paginate_by = 10

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(TopLikes, self).dispatch(*args, **kwargs)

Чего я не знаю, так это как принять top_num в качестве числа, которое нужно передать представлению, чтобы вернуть десятку книг с наибольшим количеством лайков.

для меня будет иметь смысл сделать что-то вроде queryset = Like.objects.filter(display=True).annotate(num_books=Count('books')).order_by('num_books')

Для меня имеет смысл получить лайки, а затем использовать лайки, чтобы сделать что-то подобное в шаблоне:

{% for object in object_list  %}
    {{ object.book.title }} with {{ object|length }}
{% endfor %}

Будет ли это проще сделать в виде пользовательского представления?

Спасибо

1 Ответ

3 голосов
/ 30 декабря 2011
  1. Переопределить метод get_queryset () , чтобы вы могли добавить пользовательскую фильтрацию

  2. Использовать self.kwargs , так что вы можете использовать параметр url top_num, чтобы ограничить ваш набор запросов

  3. Используйте {{object.num_books}} , потому что хорошо, что {{object | length}} все равно должен делать:)

Пример:

class TopLikes(ListView):
    """ Get all the archived projects """

    queryset = Like.objects.filter(display=True)
    template_name = "books/TopLikes.html"
    paginate_by = 10

    def get_queryset(self):
        qs = super(TopLikes, self).get_queryset()
        qs = qs.annotate(num_books=Count('books')).order_by('num_books')
        qs = qs[:self.kwargs['top_num']]
        return qs
...