Django REST Framework自定义序列化器Mixin不起作用

时间:2019-07-02 09:47:36

标签: django django-rest-framework django-serializer

我正在使用 Django 2.2 Django REST框架

在序列化程序中,我希望有几个字段仅用于创建实例而不用于更新。意味着,一旦创建,用户将无法更改该字段的值。

由于Django没有提供任何默认方式来执行此操作。我正在写一个mixin,使用它时,它将使用来自序列化程序 Meta create_only_fields从具有 PUT / PATCH 请求的请求数据中删除字段。

serializer_mixin.py

class CreateOnlyFieldsMixin(object):

    def to_internal_value(self, data):
        data = super().to_internal_value(data)
        print(data)
        if self.instance:
            # Update request
            print(data)
            for x in self.Meta.create_only_fields:
                if x in data:
                    data.pop(x)

        return data

并在序列化程序中使用

class MySerializer(CreateOnlyFieldsMixin, serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = [
            'id',
            'name',
            'value'
        ]
        create_only_fields = ['name']

但是现在调用任何端点,都会出现错误

Cannot call `.is_valid()` as no `data=` keyword argument was passed when instantiating the serializer instance.

CreateOnlyFieldsMixin放在serializers.ModelSerializer之后不会产生任何错误,但不会影响mixin。

直接在序列化器中附加to_internal_value可以正常工作。

0 个答案:

没有答案