代码之家  ›  专栏  ›  技术社区  ›  Kim Stacks

Django Rest框架:如何使更新操作(如PUT和PATCH)的字段为必需/只读?

  •  0
  • Kim Stacks  · 技术社区  · 7 年前

    我有一个Django序列化程序,它有一个字段,该字段应该只用于更新操作,如PUT和PATCH。但不适用于创建操作,如POST。

    question

    类似地,我希望对其他一些字段启用只读(或使其不可编辑),但仅对更新操作启用只读。

    我已经在谷歌上搜索了django rest框架文档,但是还没有明确的例子来说明这种自定义验证器。

    现在,我的解决办法是 required=false 总之,这不是最好的。

    2 回复  |  直到 7 年前
        1
  •  14
  •   Kim Stacks    7 年前

    您可以覆盖 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
    
        2
  •  13
  •   Saad Aleem    7 年前

    在这种情况下,我要做的是使用一个完全不同的序列化程序,该序列化程序从基序列化程序继承并重写相关字段。因此,在您的情况下,这样的方法应该有效:

    class CreateSerializer(serializers.Serializers):
        field = serializers.CharField(max_length=100)
    
    class UpdateSerializer(CreateSerializer):
        field = serializers.CharField(max_length=100, required=False)
    

    在您看来,返回相关的序列化程序:

    def get_serializer_class(self):
        if self.request.action == "POST":
            return CreateSerializer
        elif self.request.action in ["PUT", "PATCH"]:
            return UpdateSerializer
    

    我认为这是一种很好的方法,因为将来可能需要根据请求方法添加额外的逻辑。它也比猴子修补字段的更可读 required 属性

    推荐文章