Django модель order_by на основе длины кверисета другой модели

У меня есть 2 модели:

models.py

class Post(models.Model):
    title = models.CharField(max_length=255)
    desc = models.CharField(max_length=500)
    content = models.TextField()
    uploadedBy = models.ForeignKey(User, on_delete=models.CASCADE)
    
LIKE_CATEGORIES = (
    ("LIKE", "LIKE"),
    ("DISLIKE", "DISLIKE")
)

class PostLike(models.Model):
    _type = models.CharField(max_length=200, choices=LIKE_CATEGORIES, blank=True, null=True)
    
    content = models.ForeignKey(
        Post, on_delete=models.CASCADE)
        
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    
    created = models.DateTimeField(auto_now_add=True)

Я хочу упорядочить Post на основе количества лайков у сообщения. Количество лайков у поста равно количеству объектов PostLike, имеющих _type="LIKE",content=post_object.

Как я могу заказать Post конкретно на основе количества лайков?

Вы можете аннотировать каждый пост с помощью Count связанных объектов PostLike, у этого может быть фильтр, чтобы считать только связанные объекты, удовлетворяющие условию. Затем упорядочить по аннотации

from django.db.models import Count, Q
Post.objects.annotate(
    likes=Count('postlike', filter=Q(postlike___type="LIKE"))
).order_by('-likes')

Я не уверен, что иметь поле с префиксом подчеркивания - лучшая идея, это может испортить ORM и другие части внутреннего устройства Django

Это ограничит ваш фильтр постами с LIKE, а также ранжирует их

from django.db.models import Count
Post.objects.filter(postlike___type='LIKE').annotate(likes=Count('postlike')).order_by('-likes')

Or

from django.db.models import Count
Post.objects.filter(postlike___type='LIKE').annotate(Count('postlike'))[::-1]
Вернуться на верх