web-dev-qa-db-ja.com

Django=RESTフレームワークシリアライザーのフィールドを動的に除外または含める

Django RESTフレームワークは次のように定義されています:

class QuestionSerializer(serializers.Serializer):
    id = serializers.CharField()
    question_text = QuestionTextSerializer()
    topic = TopicSerializer()

上記のシリアライザーを使用する2つのAPIビューがあります。

class QuestionWithTopicView(generics.RetrieveAPIView):
    # I wish to include all three fields - id, question_text
    # and topic in this API.
    serializer_class = QuestionSerializer

class QuestionWithoutTopicView(generics.RetrieveAPIView):
    # I want to exclude topic in this API.
    serializer_class = ExamHistorySerializer

1つの解決策は、2つの異なるシリアライザーを作成することです。ただし、特定のシリアライザーからフィールドを条件付きで除外するには、より簡単な解決策が必要です。

28
Sudip Kafle

このテクニックを試しましたか

class QuestionSerializer(serializers.Serializer):
    def __init__(self, *args, **kwargs):
        remove_fields = kwargs.pop('remove_fields', None)
        super(QuestionSerializer, self).__init__(*args, **kwargs)

        if remove_fields:
            # for multiple fields in a list
            for field_name in remove_fields:
                self.fields.pop(field_name)

class QuestionWithoutTopicView(generics.RetrieveAPIView):
        serializer_class = QuestionSerializer(remove_fields=['field_to_remove1' 'field_to_remove2'])

そうでない場合は、一度試してください。

50

新しいシリアライザーを作成する方法があります。シリアライザーのフィールドを条件付きで削除することで、複雑さが増し、コードをより簡単に診断しにくくなります。単一のクラスの責任を混同しないようにしてください。

基本的なオブジェクト指向の設計原則に従うことは、進むべき道です。

QuestionWithTopicView はa QuestionWithoutTopicViewですが、追加フィールドがあります。

class QuestionSerializer(serializers.Serializer):
        id = serializers.CharField()
        question_text = QuestionTextSerializer()
        topic = TopicSerializer()

class TopicQuestionSerializer(QuestionSerializer):
       topic = TopicSerializer()
13
user1042361