Django模型order_by基于另一个模型queryset长度

Django model order_by based on another model queryset length

我有 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 的点赞数来订购 Post。 post 的点赞数是 PostLike 个拥有 _type="LIKE",content=post_object 个对象的数量。

我怎样才能根据点赞数专门订购Post

您可以用 Count 个相关的 Post 对象来注释每个 Post,这可以有一个过滤器来只计算满足条件的相关对象。然后按注解排序

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

我不确定有一个带下划线前缀的字段是最好的主意,它可能会弄乱 ORM 和 Django 内部的其他部分

这会将您的过滤器限制为 Post 并使用 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]