Django-按GenericRelation计数排序

时间:2018-12-29 18:43:25

标签: django django-orm

我有以下模型:

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

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

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:1)

我已经尝试过了。第一个图片是故事表,第二个是表。 提及:为了方便理解,我在int中使用id字段值。您可以轻松地将UUID用作主键 story table

like table

查询中:

>>> 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