как играть с порядком в представлении класса - PullRequest
1 голос
/ 09 июня 2019

Я использую представление, основанное на классе, и, например,

class PostListByMostViewedView(ListView):
    model = Post
    template_name = 'community/mostviewed_home.html'  # <app>/<model>_<viewtype>.html
    context_object_name = 'posts'
    ordering = ['-views']
    paginate_by = 5

Models.py

   class Post(models.Model):
        views = models.PositiveIntegerField(default=0)

, тогда сообщения отображаются в списке по просмотру.но у меня другая модель

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

хочу заказать по номеру поста.Я думал, что это будет работать

ordering = ['-post.comment_set.count']

, но это не работает, такой столбец: post.comment_set.count

1 Ответ

2 голосов
/ 09 июня 2019

Вы можете .annotate(..) [Django-doc] Post объектов с количеством элементов в comment_set, а затем .order_by(..) [Django-doc] эта аннотация:

from django.db.models import <b>Count</b>

class PostListByMostViewedView(ListView):
    model = Post
    queryset = Post.objects.annotate(
        <b>ncomments=Count('comment')</b>
    ).order_by(<b>'-ncomments'</b>)
    template_name = 'community/mostviewed_home.html'
    context_object_name = 'posts'
    paginate_by = 5

Приятно то, что каждый объект Post из набора запросов теперь имеет дополнительный атрибут ncomments, который содержит номеркомментариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...