Directus中如何获取关联模型字段的平均值?当前写法无效
获取关联模型字段平均值的实现方案
原写法?fields=id,position,avg(ratings.value)无法生效,因为fields查询参数仅支持指定模型已定义的字段(含关联字段的正向引用),不能直接嵌入聚合函数。
最简单的实现方式如下(以Django REST Framework为例):
步骤1:在视图查询集中添加聚合注解
通过annotate在数据库层面完成平均值计算,将结果作为新字段附加到查询集:
from django.db.models import Avg from rest_framework.generics import ListAPIView from .models import YourModel from .serializers import YourModelSerializer class YourModelListView(ListAPIView): # 用annotate添加avg_rating字段,关联ratings模型的value字段求平均 queryset = YourModel.objects.annotate(avg_rating=Avg('ratings__value')) serializer_class = YourModelSerializer
步骤2:在序列化器中声明聚合字段
如果序列化器原本没有这个字段,需要添加只读字段来返回聚合结果:
from rest_framework import serializers from .models import YourModel class YourModelSerializer(serializers.ModelSerializer): # 声明只读的avg_rating字段,对应查询集中的注解字段 avg_rating = serializers.FloatField(read_only=True) class Meta: model = YourModel fields = ['id', 'position', 'avg_rating']
步骤3:前端请求指定字段
现在可以通过?fields=id,position,avg_rating获取包含平均值的结果,和普通字段的用法一致。
这种方式的优势是聚合计算在数据库层面完成,性能远高于在代码中循环计算关联数据的平均值。
内容的提问来源于stack exchange,提问作者TemporaryName
相关产品推荐
相关产品推荐

