Python Django rest框架仅创建序列化程序字段
我有一个Django模型作为请求描述。创建它是为了由REST客户端发出请求,用于记录任务的当前状态,并记录客户端接收到的历史请求 该模型有几个字段,用于微调和控制请求的任务(例如,目标对象和操作类型)。显然,我希望客户端在创建对象时控制这些字段,但在创建之后不控制(一旦任务开始运行,就不能更改对象) 我希望有类似于Python Django rest框架仅创建序列化程序字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个Django模型作为请求描述。创建它是为了由REST客户端发出请求,用于记录任务的当前状态,并记录客户端接收到的历史请求 该模型有几个字段,用于微调和控制请求的任务(例如,目标对象和操作类型)。显然,我希望客户端在创建对象时控制这些字段,但在创建之后不控制(一旦任务开始运行,就不能更改对象) 我希望有类似于序列化程序的东西。ReadOnlyField,所以我可以有类似的东西: class TaskSerializer(serializers.ModelSerializer): o
序列化程序的东西。ReadOnlyField
,所以我可以有类似的东西:
class TaskSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
task_id = serializers.ReadOnlyField()
target_object = serializers.CreateOnlyField()
但是在文档或google中找不到它。仅扩展Wim的答案,这是一种根据传入请求方法选择不同序列化服务器的方法:
class RequestViewSet(viewsets.ModelViewSet):
serializer_class = RequestModelSerializer
model = Request
def get_serializer_class(self):
serializer_class = self.serializer_class
if self.request.method == 'POST':
serializer_class = SerializerWithoutCertainFields
return serializer_class
另一个解决方案可能是
CreateOnlyDefault
()。的答案是@fabio.susset,让我走上正轨。我觉得我的答案稍微漂亮一点;我不直接在类上指定序列化程序,只在get\u serializer\u class()
中指定。此外,我不会根据HTTP类型(即POST
)切换它,而是根据操作update
,我认为这更具声明性
class RequestViewSet(ViewSet.ModelViewSet):
模型=请求
def get_序列化程序_类(自身):
如果self.action==“更新”:
返回serializer\u class=SerializerWithoutCertainFields
返回RequestModelSerializer
CreateOnlyDefault
非常有用,但仅适用于对该视图/序列化程序的所有请求都相同的默认值。也就是说,它可以用于“创建日期”(虽然您也可以在模型上这样做)或“创建人”或一些静态值,但对于用户可以在创建时指定但之后不会更改的值来说,它没有用处。