Python 按帖子排名排序的用户列表

Python 按帖子排名排序的用户列表,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,我想制作一个API端点,这样用户就可以根据他们的帖子评论获得他所在城市的用户列表 我已经在post模型中定义了一种方法来计算总评论(向上投票和向下投票),我想象这个解决方案可以通过以下路径实现,但我不完全确定post中的groupBy post\u owner和orderBy sum(count\u reactions()),但我不知道如何在django中实现它 后期模型 class Post(models.Model): title=models.TextField(最大长度=255,默认值为

我想制作一个
API端点
,这样用户就可以根据他们的帖子评论获得他所在城市的用户列表

我已经在post模型中定义了一种方法来计算总评论(向上投票和向下投票),我想象这个解决方案可以通过以下路径实现,但我不完全确定post中的
groupBy post\u owner
orderBy sum(count\u reactions())
,但我不知道如何在django中实现它

后期模型

class Post(models.Model):
title=models.TextField(最大长度=255,默认值为class='title')
post_owner=models.ForeignKey(MyUser,on_delete=models.CASCADE)
description=models.TextField(最大长度=255)
city=models.ForeignKey(城市,相关的_name='location',在_delete=models.CASCADE上)
经度=models.CharField(最大长度=255)
image=models.CharField(最大长度=255,
默认值https://www.eltis.org/sites/default/files/styles/web_quality/public/default_images/photo_default_2.png')
纬度=models.CharField(最大长度=255)
已创建\u at=models.DateTimeField(自动\u now\u add=True)
def计数_反应(自身):
likes\u count=Reaction.objects.filter(post=self.id,is\u like=True)
不喜欢\u count=Reaction.objects.filter(post=self.id,is\u like=False)。count()
返回喜欢次数-不喜欢次数
def所有者(自身):
返回self.post\u所有者
我的用户模型

类MyUser(AbstractUser):
电话号码=models.BigIntegerField(空白=假,唯一=真)
city=models.ForeignKey(城市,相关的城市,在_delete=models.CASCADE上)
地址=models.CharField(最大长度=255)
def所有者(自身):
回归自我
反应模型

课堂反应(models.Model):
反应\u owner=models.ForeignKey(MyUser,on\u delete=models.CASCADE)
post=models.ForeignKey(post,related\u name='reactions',on\u delete=models.CASCADE)
is_like=models.BooleanField(null=False)
def所有者(自身):
返回self.reaction\u所有者

预期的结果是通过用户的帖子评论获得用户的有序列表,但只有同一城市的用户(MyUser模型中的城市字段)

您可以将其全部放入一个查询中

根据您的
反应
对查询的命名应如下所示:

# Filter for the city you want
users = MyUser.objects.filter(city=your_city_obj)

# Then doing the calculations
users = users.annotate(rank_point=(Count('post__reactions', filter=Q(post__reactions__is_like=True)) - (Count('post__reactions', filter=Q(post__reactions__is_like=False)))))

# And finaly, order the results
users = users.order_by('-rank_point')

您可以将其全部放在一个查询中

根据您的
反应
对查询的命名应如下所示:

# Filter for the city you want
users = MyUser.objects.filter(city=your_city_obj)

# Then doing the calculations
users = users.annotate(rank_point=(Count('post__reactions', filter=Q(post__reactions__is_like=True)) - (Count('post__reactions', filter=Q(post__reactions__is_like=False)))))

# And finaly, order the results
users = users.order_by('-rank_point')
答案是答案,但在完成它时,排除排名等于零的用户,并包括限制

#筛选所需城市
users=MyUser.objects.filter(city=your\u city\u obj)
#然后做计算
用户=用户。注释(排名点=(计数('post\u reactions',filter=Q(post\u reactions\uu is\u like=True))-(计数('post\u reactions',filter=Q(post\u reactions\uu is\u like=False)')。筛选(排名点\uu gt=0)
#最后,对结果进行排序
users=users.order_by('-rank_point')[:LIMIT]
答案是答案,但要完成它,必须排除排名等于零的用户,并包括限制

#筛选所需城市
users=MyUser.objects.filter(city=your\u city\u obj)
#然后做计算
用户=用户。注释(排名点=(计数('post\u reactions',filter=Q(post\u reactions\uu is\u like=True))-(计数('post\u reactions',filter=Q(post\u reactions\uu is\u like=False)')。筛选(排名点\uu gt=0)
#最后,对结果进行排序
users=users.order_by('-rank_point')[:LIMIT]

不完全清楚您想要什么,因为您首先谈论获取用户列表,然后讨论按用户对帖子进行分组和排序(什么是
count\u review
?在您的代码中有
count\u反应
)。但这里有一些提示:Django中的groupby是通过使用
.values()
来完成的,而将值添加到sort BY是通过
.annotate()
来完成的,其聚合函数类似于
Sum()
。查一查,这部分是我想象的解决方案(或我尝试过的),我不完全确定。让我们看看你尝试了什么。这将使您更容易理解您要查找的查询。但我真的建议你仔细研究我链接的页面。最好的方法是使用您的python控制台直接尝试您的查询。不完全清楚您想要什么,因为首先您谈到获取用户列表,然后您谈到按用户对帖子进行分组和排序(以及什么是
count\u review
?在您的代码中有
count\u反应
)。但这里有一些提示:Django中的groupby是通过使用
.values()
来完成的,而将值添加到sort BY是通过
.annotate()
来完成的,其聚合函数类似于
Sum()
。查一查,这部分是我想象的解决方案(或我尝试过的),我不完全确定。让我们看看你尝试了什么。这将使您更容易理解您要查找的查询。但我真的建议你仔细研究我链接的页面。最好的方法是使用python控制台直接尝试您的查询。问题经过编辑,这样您就可以看到反应模型。我认为它应该可以工作,或者应该将
post\uu reaction
更改为
post\uu reactions
。试试看,如果有错误请告诉我。我有一个错误
NameError:name'post\uu reactions'没有定义
我做了一个更改,
Count(post\uu reactions)
应该更改为
Count('post\uu reactions')
。此外,我还测试了代码,
post_uureaction
是正确的名称。它现在可以正常工作,但如何仅提取排名大于零的用户?编辑问题,以便您可以查看反应模型。我认为它应该可以工作,或者应该将
post_ureaction
更改为