シリアライザはネストされたフィールドの集まりで作成され、これらのネストされたオブジェクトの数値の平均を計算します。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()
私も詳しく、リストビューの異なるシリアライザを使用
...
私は「難易度」フィールドの平均によって私の「質問」オブジェクトをフィルタリングすることができる方法の任意のアイデア
?
これは完璧です、ありがとうございました! – Jibsgrl