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つの異なるシリアライザーを作成することです。ただし、特定のシリアライザーからフィールドを条件付きで除外するには、より簡単な解決策が必要です。
このテクニックを試しましたか
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'])
そうでない場合は、一度試してください。
新しいシリアライザーを作成する方法があります。シリアライザーのフィールドを条件付きで削除することで、複雑さが増し、コードをより簡単に診断しにくくなります。単一のクラスの責任を混同しないようにしてください。
基本的なオブジェクト指向の設計原則に従うことは、進むべき道です。
QuestionWithTopicView はa QuestionWithoutTopicViewですが、追加フィールドがあります。
class QuestionSerializer(serializers.Serializer):
id = serializers.CharField()
question_text = QuestionTextSerializer()
topic = TopicSerializer()
class TopicQuestionSerializer(QuestionSerializer):
topic = TopicSerializer()