Упорядочивание 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()