在Django REST框架中,我有一个序列化程序,定义如下:
class QuestionSerializer(serializers.Serializer):
id = serializers.CharField()
question_text = QuestionTextSerializer()
topic = TopicSerializer()
现在我有了两个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
一种解决方案是编写两个不同的序列化程序。但是,必须有一个更容易的解决方案,以便有条件地从给定的序列化程序中排除字段。
发布于 2015-01-13 20:50:54
你试过这种技术吗?
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'])
如果没有,那就试一试。
发布于 2015-07-20 18:37:26
创建一个新的序列化程序是可行的。通过有条件地删除序列化程序中的字段,您将增加额外的复杂性,并使您的代码更难快速诊断。您应该尽量避免混淆单个类的职责。
遵循基本的面向对象的设计原则是可行的。
QuestionWithTopicView 是一个 QuestionWithoutTopicView,但有一个附加字段。
class QuestionSerializer(serializers.Serializer):
id = serializers.CharField()
question_text = QuestionTextSerializer()
topic = TopicSerializer()
class TopicQuestionSerializer(QuestionSerializer):
topic = TopicSerializer()
发布于 2021-07-13 05:34:06
您可以设置fields
和exclude
属性的Meta
以下是一个例子:
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
class Meta:
model = User
exclude = ['id', 'email', 'mobile']
def __init__(self, *args, **kwargs):
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
# @note: For example based on user, we will send different fields
if self.context['request'].user == self.instance.user:
# Or set self.Meta.fields = ['first_name', 'last_name', 'email', 'mobile',]
self.Meta.exclude = ['id']
https://stackoverflow.com/questions/27935558
复制相似问题