【问题标题】:How to filter a nested filed averaged on Django Rest Framework?如何过滤在 Django Rest Framework 上平均的嵌套文件?
【发布时间】: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


    【解决方案1】:

    试试看:

    class QuestionListSerializer(ModelSerializer):
    
        difficulty_avg = serializers.IntegerField()
    

    查看

    class QuestionFilter(FilterSet):
        difficulty_avg__gt = django_filters.NumberFilter(name='difficulty_avg', lookup_expr='gt')
        difficulty_avg__lt = django_filters.NumberFilter(name='difficulty_avg', lookup_expr='lt')
    
        class Meta:
             model = models.Question
             fields = {'difficulty_avg': ['lt', 'gt']}
    
    
    class QuestionViewSet(ModelViewSet):
        queryset = models.Question.objects.annotate(difficulty_avg=Avg('difficulty_questions__difficulty'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-19
      • 2015-09-21
      • 2015-03-25
      • 1970-01-01
      • 2019-07-11
      • 2021-09-21
      • 1970-01-01
      • 2020-12-30
      相关资源
      最近更新 更多