Задать вопрос
@bQ1

Как отсортировать QuerySet по методу?

Есть две таблицы:
1) Пользователи
2) Записи

Связаны по ForeignKey

Есть метод:
def get_posts_count(self):
return self.get_posts().count()

Как отсортировать queryset по этому методу? и возможно ли это вообще?

Пробовал так: users.order_by('get_posts_count') - Cannot resolve keyword
  • Вопрос задан
  • 88 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 2
@dimuska139
Backend developer
Самый простой способ - это не считать количество для каждого юзера каждый раз, а при создании/удалении юзером своей записи один раз считать количество его записей и обновлять его значение в поле в таблице пользователей. То есть в таблице с пользователями у тебя будет поле posts_count, в котором будет храниться количество постов юзера) - и просто по нему делай сортировку. Это и проще, и быстрее работать будет.

А если делать через метод get_posts_count, то для отображения списка пользователей с количеством их постов на странице, у тебя к базе будет сделано N запросов для подсчета количества, где N - это число пользователей которые будут отображены на странице, что совсем не оптимально.

Но если уж хочется не делать отдельное поле и считать количество одним запросом вместе с выборкой юзеров, то можно через annotate (взял из доки):
>>> from django.db.models import Count
>>> q = Book.objects.annotate(Count('authors'))
# Interrogate the first object in the queryset
>>> q[0]
<Book: The Definitive Guide to Django>
>>> q[0].authors__count
2
Ответ написан
netpastor
@netpastor
Python developer
User.objects.annotate(posts_count=Count('posts')).order_by('posts_count')
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы