Kim*_*cks 12 django serialization deserialization django-rest-framework
我有一个 Django Serializer,它有一个字段,只有更新操作(例如 PUT 和 PATCH)才需要该字段。但不适用于诸如 POST 之类的创建操作。
我发现了这个类似的 SO问题,但没有关于如何编写自定义验证来检测操作是用于创建、更新还是补丁的线索。
同样,我想为其他一些字段打开 read_only (或使它们不可编辑),但仅适用于更新操作。
我用谷歌搜索了 django rest 框架文档,但没有此类自定义验证器的明确示例。
现在,我的解决方法是required=false
完全设置这不是最好的。
请指教。
ama*_*mar 14
您可以覆盖的get_fields
方法,serializer
然后您可以更改该字段的值
class SomeDataSerializer(serializers.ModelSerializer):
some_field = serializers.CharField(max_length=100)
def get_fields(self, *args, **kwargs):
fields = super(SomeDataSerializer, self).get_fields(*args, **kwargs)
request = self.context.get('request', None)
if request and getattr(request, 'method', None) == "POST":
fields['some_field'].required = False
return fields
Run Code Online (Sandbox Code Playgroud)
Saa*_*eem 12
在这种情况下,我所做的是完全不同的序列化程序,它继承自基本序列化程序并覆盖相关字段。所以在你的情况下,这样的方法应该有效:
class CreateSerializer(serializers.Serializers):
field = serializers.CharField(max_length=100)
class UpdateSerializer(CreateSerializer):
field = serializers.CharField(max_length=100, required=False)
Run Code Online (Sandbox Code Playgroud)
在您看来,返回相关的序列化程序:
def get_serializer_class(self):
if self.request.action == "POST":
return CreateSerializer
elif self.request.action in ["PUT", "PATCH"]:
return UpdateSerializer
Run Code Online (Sandbox Code Playgroud)
我认为这是一个很好的方法,因为您将来可能需要根据请求方法添加额外的逻辑。它也比猴子修补字段的required
属性更具可读性。
归档时间: |
|
查看次数: |
3405 次 |
最近记录: |