假设我有一个这样的模型:
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();
}
});
答案 0 :(得分:5)
我需要更多的空间而不是评论,以明确我的意思。所以这就是我的建议:
不同的格式化意味着不同的序列化程序。
所以在这里,例如MyModelSerializer
和MyModelCreationSerializer
。要么独立创建它们,要么让一个继承另一个并专门化它(如果有意义的话)。
使用适当的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方法