Django - 按 GenericRelation 计数排序

Django - Order by a GenericRelation count

我有以下型号:

class Story(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=255)
    description = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='stories')
    likes = GenericRelation(Like)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

Like 只是一个使用 Django 内容类型框架的简单模型:

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.CharField(max_length=36)
    target = GenericForeignKey('content_type', 'object_id')

我只想按最喜欢的顺序排列我的故事,但我做不到。我尝试了以下但无济于事:

stories = Story.objects.annotate(count=Count('likes')).order_by('-count')

这是我的输出:

>>> Story.objects.values('id').annotate(count=Count('likes')).order_by('-count')[:5]
<QuerySet [{'id': UUID('00feaa91-28b7-46c9-8755-7368408f195e'), 'count': 0}, {'id': UUID('02b8167c-19c2-41f8-819b-d0043ea03a65'), 'count': 0}, {'id': UUID('042215b0-69be-402e-9f31-8097f3a0c1c6'), 'count': 0}, {'id': UUID('0a3cb717-54e0-49d7-b0f0-e19cffb28df9'), 'count': 0}, {'id': UUID('0b4230f9-67e7-4cc1-a8bd-8b5c3c8b0917'), 'count': 0}]>
>>> 

这很奇怪,因为我有喜欢的故事...

更奇怪的是:

>>> Story.objects.aggregate(Count('likes'))
{'likes__count': 0}
>>> 

但我知道有些故事很受欢迎:

>>> Like.objects.count()
9

到目前为止我只喜欢故事。

有简单的方法吗?

这个我试过了。第一张图片是故事 table,第二张是 table。 提一下:我在 int 中使用 id 字段值只是为了便于理解。您可以轻松地使用 UUID 作为您的主键

查询中:

>>> stories = Story.objects.annotate(count=Count('likes')).order_by('-count')
>>> stories.values('count')
<QuerySet [{'count': 3}, {'count': 2}, {'count': 1}]>
>>> for story in stories:
...    print(story.count)
...    
3
2
1