【发布时间】:2018-03-03 09:16:14
【问题描述】:
我的序列化器是由一个嵌套字段的聚合组成的,我计算这些嵌套对象上的一个数字的平均值。
Question 对象与Difficulty_Question 对象嵌套(Difficulty_Question 对象上的“外键”关系)。
Difficulty_Question 有一个“难度”字段,我在 Question 对象上进行了平均和汇总。 (见get_difficulty函数)
我想过滤具有一定难度的Question 对象。
我的序列化器看起来像:
serializer.py:
class QuestionListSerializer(ModelSerializer):
difficulty = serializers.SerializerMethodField()
def get_difficulty(self, obj):
average = obj.difficulty_questions.all().aggregate(Avg('difficulty')).get('difficulty__avg')
if average is None:
return 0
return average
class Meta:
model = models.Question
fields = (
'id',
'name',
'difficulty',
)
我尝试按难度过滤这个 django 对象,但我能做的就是过滤嵌套字段的所有对象,而不是所有对象的平均值..
view.py
class QuestionFilter(FilterSet):
difficulty_questions__difficulty__gt = django_filters.NumberFilter(name='difficulty_questions__difficulty', lookup_expr='gt')
difficulty_questions__difficulty__lt = django_filters.NumberFilter(name='difficulty_questions__difficulty', lookup_expr='lt')
class Meta:
model = models.Question
fields = {'difficulty_questions__difficulty': ['lt', 'gt']}
class QuestionViewSet(ModelViewSet):
queryset = models.Question.objects.all()
serializer_class = serializers.QuestionSerializer
action_serializers = {
'retrieve': serializers.QuestionSerializer,
'list': serializers.QuestionListSerializer,
'create': serializers.QuestionSerializer
}
filter_class = QuestionFilter
def get_serializer_class(self):
if hasattr(self, 'action_serializers'):
if self.action in self.action_serializers:
return self.action_serializers[self.action]
return super(QuestionViewSet, self).get_serializer_class()
我还为详细视图和列表视图使用不同的序列化程序...
关于如何通过“难度”字段的平均值过滤我的“问题”对象有什么想法吗?
【问题讨论】:
标签: python django django-rest-framework filtering django-queryset