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
更改为