0

シリアライザはネストされたフィールドの集まりで作成され、これらのネストされたオブジェクトの数値の平均を計算します。Django Rest Frameworkで平均したネストされたフィールドをフィルタリングする方法は?

オブジェクトはDifficulty_Questionオブジェクト(Difficulty_Questionオブジェクトの 'ForeignKey'リレーション)でネストされています。 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', 
     ) 

私は難易度によって、このジャンゴオブジェクトをフィルタ処理しようとしますが、私にできることすべては、ネストされたフィールドのすべてのオブジェクトをフィルタでありますすべてのオブジェクトの、平均ではありません。..

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() 
私も詳しく、リストビューの異なるシリアライザを使用

...

私は「難易度」フィールドの平均によって私の「質問」オブジェクトをフィルタリングすることができる方法の任意のアイデア

答えて

0

は、それを試してみてください。

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')) 
+0

これは完璧です、ありがとうございました! – Jibsgrl

関連する問題