Python Django Rest框架星级评定系统

Python Django Rest框架星级评定系统,python,django,django-rest-framework,Python,Django,Django Rest Framework,我在Django模型中有以下结构 收视率.models.py 等级评定(models.Model): 类元: 详细名称='Rating' 详细名称复数='Ratings' 唯一_在一起=[ “用户”, “产品”] user=models.ForeignKey( settings.AUTH\u用户\u模型, 在_delete=models.CASCADE上, 相关_name='user') 产品=型号。外键( 产品 在_delete=models.CASCADE上, 相关_name='produc

我在Django模型中有以下结构

收视率.models.py

等级评定(models.Model):
类元:
详细名称='Rating'
详细名称复数='Ratings'
唯一_在一起=[
“用户”,
“产品”]
user=models.ForeignKey(
settings.AUTH\u用户\u模型,
在_delete=models.CASCADE上,
相关_name='user')
产品=型号。外键(
产品
在_delete=models.CASCADE上,
相关_name='product')
评级=型号。正积分字段(
null=False,
空白=假)
产品
在这里没有什么特别的展示。只是一个简单的Django模型。我将省略它

在序列化程序的ProductDetailView中,我需要每个评级的计数。一个产品的等级可以从1到5。 例如:

我通过以下代码实现了这一点

类ProductDetailSerializer(serializers.ModelSerializer):
ratings=serializers.SerializerMethodField('get\u ratings\u detail'))
类元:
型号=产品
字段=[…,“评级”,]
def获取详细等级(自我、obj):
ratings=Rating.objects.filter(
产品=obj)
r_详情=评级。合计(
等级1=计数(
“产品”,
过滤器=Q(额定值=1)),
评级2=计数(
“产品”,
过滤器=Q(额定值=2)),
额定值3=计数(
“产品”,
过滤器=Q(额定值=3)),
额定值4=计数(
“产品”,
过滤器=Q(额定值=4)),
评级5=计数(
“产品”,
过滤器=Q(额定值=5)),
)
返回r_详细信息
我的问题是,我是否可以用更好的方法达到同样的结果? 我很不喜欢
get\u ratings\u detail
的样子,而且我也不确定这是否是最好的方式。
谢谢。

我只需要获取评级值,使用a,然后根据需要解析出来

from collections import Counter
ratings = Counter(ratings.values_list("rating", flat=True))
比如说,

>>> {f"rating{star}_star": count for star, count in ratings.items()} 
{'rating5_star': 1, 'rating2_star': 2, 'rating3_star': 2, 'rating4_star': 1, 'rating1_star': 1}

你的答案大体上是正确的。我会接受的。在我的应用程序中,我发现我需要的不仅仅是每颗星的评级。我需要一个平均每颗星和一个全球的。最小值、最大值(用于分析)、全局总计和每次启动总计。我想建立一个类似于谷歌play商店的评级系统。谢谢你的回答。
>>> {f"rating{star}_star": count for star, count in ratings.items()} 
{'rating5_star': 1, 'rating2_star': 2, 'rating3_star': 2, 'rating4_star': 1, 'rating1_star': 1}