我正在使用 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
可以正常工作。