python - 返回模型中值的平均值而不是每个值
问题描述
我正在尝试在 django 中制作电影项目。我想对电影的收视率有一个看法,它可以采用单个 rate_value 但通过 GET 返回电影收视率的平均值。
我不知道我应该从哪里开始。我尝试了视图和序列化程序的一些更改,但没有奏效。以下是:
视图.py:
class RateListView(generics.ListCreateAPIView):
permission_classes = [AllowAny]
serializer_class = RateSerializer
lookup_url_kwarg = 'rateid'
def get_queryset(self):
rateid = self.kwargs.get(self.lookup_url_kwarg)
queryset = Rate.objects.filter(film = rateid)
# .aggregate(Avg('rate_value'))
if queryset.exists():
return queryset
else:
raise Http404
def post(self, request, *args, **kwargs):
serializer = RateSerializer(data = request.data)
if serializer.is_valid():
if Film.objects.filter(pk = self.kwargs.get(self.lookup_url_kwarg)).exists():
serializer.save(film_id = self.kwargs.get(self.lookup_url_kwarg))
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
raise Http404
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
序列化程序.py
class RateSerializer(serializers.ModelSerializer):
class Meta:
model = Rate
fields = ('rate_value',)
和模型.py
class Rate(models.Model):
film = models.ForeignKey(Film, on_delete = models.CASCADE)
rate_value = models.IntegerField(validators = [
MinValueValidator(1),
MaxValueValidator(10)
]
)
def __str__(self):
return str(self.film.title) + str(self.rate_value)
现在它正确返回单个值。
解决方案
class Film(models.Model:
...
@property
def mean_rating(self):
ratings = self.ratings.all().values_list('rate_value', flat=True)
if ratings:
return sum(ratings)/len(ratings)
# return a separate default value here if no ratings
class Rate(models.Model):
film = models.ForeignKey(Film, on_delete = models.CASCADE, related_name='ratings')
rate_value = models.IntegerField(validators = [
MinValueValidator(1),
MaxValueValidator(10)
]
)
...
class FilmSerializer(serializers.ModelSerializer):
class Meta:
model = Film
fields = ('id','name','mean_rating',)
无需深入了解您的应用程序架构,这里有一个可以使用的模式。ratings
Film 对象有一个计算属性,该属性调用related_name
提供给电影评级的 ,以获取所有相关评级并返回平均值。
只要提供可序列化的值,模型的属性就可以用作序列化器字段。
有关 Django 中模型的 related_name 的更多信息,请参阅此处 - What is `related_name` used in Django?
推荐阅读
- reactjs - 如何使用反应挂钩从 API 传递数据?
- java - 如何在 Appium 中使用 Xpath 获取最后一个元素
- php - Smarty While 嵌套循环仅显示第一行
- json - 如何将 Varbinary 列转换为 Base64 字符串以保存为 Json?
- mysql - 在 mysql 中显示数据库注释
- regex - PowerShell - 删除文本文件中分隔符之间的多行文本
- java - 等待元素在 Selenium 中真正可点击
- c++ - IAR C 编译器开关:快速查询
- ios - 移动苹果地图苹果标志“合法”文字
- dataframe - 有没有更好的方法在 Python 中查找汇总统计信息?