每个请求方法在drf序列化器中进行不同的验证

Mr *_* T. 6 python django validation serialization django-rest-framework

可以说我有一个这样的模型:

class MyModel(models.Model):
    first_field = models.CharField()
    second_field = models.CharField()
Run Code Online (Sandbox Code Playgroud)

和这样的API视图:

class MyModelDetailAPI(GenericAPIView):
    serializer_class = MyModelSerializer
    def patch(self, request, *args, **kwargs):
        # Do the update
    def post(self, request, *args, **kwargs):
        # Do the post
Run Code Online (Sandbox Code Playgroud)

first_field字段仅插入POST方法(并且是必需的),但在每次更新时,用户都无法更改其值,因此PATCH方法中的字段不是必需的.
如何编写我的序列化程序,以便first_field在POST时需要,但在PATCH上不需要.有没有办法动态设置所需的字段,所以我仍然可以使用DRF验证机制?每种请求方法都有某种验证器调度程序?
我想要这样的东西,例如:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = {
                    'POST': ['first_field']
                    'PATCH': []
                 }
Run Code Online (Sandbox Code Playgroud)

spe*_*ras 5

我需要更多的空间而不是评论,以明确我的意思.所以这就是我的建议:

  1. 不同格式化意味着不同的序列化

    所以你在这里,例如a MyModelSerializer和a MyModelCreationSerializer.要么独立创建它们,要么让一个继承另一个并专门化它(如果有意义的话).

  2. 使用适当的GenericAPIView钩子返回正确的序列化器类,具体取决于self.action.一个非常基本的例子可能是:

    class MyModelDetailAPI(GenericAPIView):
        # serializer_class = unneeded as we override the hook below
    
        def get_serializer_class(self):
            if self.action == 'create':
                return MyModelCreationSerializer 
            return MyModelSerializer
    
    Run Code Online (Sandbox Code Playgroud)

    此处记录了常规视图集中的默认操作,它们是:

    • create:基本路由URL上的POST方法
    • list:基本路由URL上的GET方法
    • retrieve:对象url上的GET方法
    • update:对象url上的PUT方法
    • partial_update:对象url上的PATCH方法
    • destroy:对象url上的DELETE方法