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
我有以下型号:
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