我在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

一种解决方案是编写两个不同的序列化程序.但是必须有一个更简单的解决方案来有条件地从给定的序列化程序中排除一个字段.

推荐答案

你试过这个技巧吗

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'])

如果没有,那就试一次.

Django相关问答推荐

在生产中添加整型主键

如何在Django中显示多个相关对象

Django 中主键的隐式 UUID 自动字段

错误``Forbidden (403) CSRF 验证失败.请求中止.``` 当try 登录管理员时

django 无法识别实现自定义后端

无法创建超级用户,因为 Django 中的一列(外键)不能为空

Django:使用相同的外键在不同的应用程序中 Select 多个列

Django - 是否可以为查询集预取单个字段的多个过滤器?

Django 模型命名约定

获取结果集中返回的元素数的 django 模板标签是什么?

为 Django 模型生成非顺序 ID/PK

测试 Django ModelForm 是否有实例

更新Django模型对象多个字段的有效方法

使用 lambda 作为属性的默认值时,Django 1.7.1 Makemigrations 失败

Django:使用 ModelForm 编辑现有数据库条目

如何使用 SQL 的IN等字段上的数组过滤 django 查询集?

Python - 覆盖 __init__ 的最干净方法,其中在 super() 调用之后必须使用可选的 kwarg?

Celery - 在一台服务器上运行不同的工作人员

保存前向 ModelForm 对象添加数据

如何更改模型标签并给它一个自定义名称