DRF:在同一个Serializer上为每个CRUD操作分隔字段

时间:2016-09-05 16:31:26

标签: django django-rest-framework

我有一个看起来像这样的序列化程序

class MySerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = ('A', 'B')   
        # 'C' is mandatory to create the object but dont include it on GET

    def create(self, validated_data):
        # validated_data contains C ...
        instance = MyModel(**validated_data)
        print instance.__dict__  # C is None !?!?!
        instance.save()
        return instance
  • 当我返回资源时,按照GET请求,我只想为每一行(对象)'A'和'B'
  • 当我创建资源时,按照POST请求,我必须包含必需的第三个属性'C'

视图正常工作并在validated_data内传递 C ,但是当我创建MyModel时,它最终没有C值,如上所示。

如果我在fields元组中添加'C',那么一切正常......

是否有明智的方法来区分这两种情况?编写多个序列化器(以便每个定义不同的字段)对我来说似乎太难看了。

2 个答案:

答案 0 :(得分:3)

http://www.django-rest-framework.org/api-guide/fields/#write_only

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('A', 'B', 'C')
        extra_kwargs = {'C': {'write_only': True}}

答案 1 :(得分:-1)

拉米尔是对的。我错过了extra_kwargs中的那个属性。最后,确切的解决方案是:

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('A', 'B', 'C')
        extra_kwargs = {'C': {'write_only': True}}

如果我不包含“C' fields validated_data未传递{{1}}。