Упорядочивание Django по количеству связанных объектов в классе Meta

В Django я хочу установить стандартное упорядочивание модели по количеству связанных объектов. В моем случае я хотел бы упорядочить объекты по количеству лайков, где лайк - это ManyToManyField пользователей, которым понравился пост:

class Post(models.Model):
    likes = models.ManyToManyField(User)

    class Meta:
        ordering = []  # What can i put here?

Общим решением кажется агрегация джанго:

from django.db.models import Count

top_posts = Post.objects.annotate(num_likes=Count('likes')).order_by('-num_likes')

Но это вызывается на queryset, и не похоже, что это можно сделать при определении модели.

Вероятно, в этом случае лучше всего работать с менеджером:

class PostManager(models.Manager):
    def get_queryset(self, *args, **kwargs):
        return (
            super()
            .get_queryset(*args, **kwargs)
            .alias(num_likes=Count('likes'))
            .order_by('-num_likes')
        )


class Post(models.Model):
    likes = models.ManyToManyField(User)

    objects = PostManager()
Вернуться на верх