我有一个Django模型作为请求描述。创建它是为了由REST客户端发出请求,用于记录任务的当前状态,并记录客户端收到的历史请求。
此模型有一些字段用于微调和控制请求的任务(例如,目标对象和操作类型)。显然,我希望客户端在对象创建时控制这些字段,但之后不能控制(一旦任务开始运行,您就无法更改对象)。
我希望有类似于serializers.ReadOnlyField
的东西,所以我可以有类似的东西:
class TaskSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
task_id = serializers.ReadOnlyField()
target_object = serializers.CreateOnlyField()
但无法在文档或谷歌中找到它。
答案 0 :(得分:13)
为了扩展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
答案 1 :(得分:0)
另一个解决方案可能是CreateOnlyDefault
(https://www.django-rest-framework.org/api-guide/validators/#createonlydefault)。
答案 2 :(得分:0)
@fabio.sussetto 的回答让我走上了正轨。我觉得我的回答稍微漂亮一些;我没有直接在类上指定序列化程序,而是仅在 get_serializer_class()
中指定。此外,我不会根据 HTTP 类型(即 POST
)切换它,而是根据操作 update
,我认为它更具声明性。
class RequestViewSet(viewsets.ModelViewSet):
model = Request
def get_serializer_class(self):
if self.action == 'update':
return serializer_class = SerializerWithoutCertainFields
return RequestModelSerializer