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

时间:2016-07-03 14:35:46

标签: python django validation serialization django-rest-framework

假设我有一个这样的模型:

class MyModel(models.Model):
    first_field = models.CharField()
    second_field = models.CharField()

和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

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

$('#status').change(function() {
  if ($(this).val() > 1) {
    $('#myInput').show();
  } else {
    $('#myInput').hide();
  }
});

1 个答案:

答案 0 :(得分:5)

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

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

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

  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
    

    常规视图集中的默认操作记录为here,它们是:

    • create:基本路线网址上的POST方法
    • list:基本路线网址上的GET方法
    • retrieve:对象网址上的GET方法
    • update:对象网址上的PUT方法
    • partial_update:对象网址上的PATCH方法
    • destroy:对象网址上的DELETE方法