Django Rest Framework:如何为 PUT 和 PATCH 等更新操作设置必填字段/只读字段?

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属性更具可读性。

  • 这实际上是一个很好的答案。如上所述,不会有“重复的代码”,因为共享的任何内容都会进入基础。 (2认同)