[英](Django REST) Override Non-Editable Field in the (Views) `create` Method
在我的models.py
,我创建了一个用户不可编辑的字段:
request_status = models.CharField(
max_length = 100,
default = 'received',
editable = False
)
在views.py
文件中,我覆盖create()
方法(来自generics.ListCreateAPIView
和CreateModelMixin
超类)以激活docker 容器,如果成功完成,我想将request_status
字段修改为container_activated
类的container_activated
,然后将 HTTP 响应发回给用户。
那么......有没有办法修改不可编辑的字段? 有没有更好的方法来设置model
?
我最好的猜测是,有一种方法可以通过标准create()
方法的其中一行修改在 API DB 中注册的数据(不可编辑的字段不会出现在data
属性中):
serializer = self.get_serializer(data = request.data)
serializer.is_valid(raise_exception = True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
editable=False
并不意味着您根本无法编辑该字段,它仅意味着默认情况下它不会显示在管理员或模型表单中。 在 DRF 中,这意味着它将自动设置为read_only
; 但是您可以简单地手动定义字段来覆盖它。
class MySerializer(serializers.ModelSerializer):
request_status = serializers.CharField(max_length=100, default='received')
class Meta:
...
这是一种规避,但它或多或少地工作得很好。 我将我的字段改回了editable = True
,然后我只是将其强制为默认锁定(硬编码)值。 最后,在views.py
类的create()
中,您放置如下内容:
def create(
self,
request,
*args,
**kwargs
):
# Settings of the POST request
req_data = request.data.dict()
req_data['request_status'] = 'not yet processed'
# Is everything OK?
if processing_OK == 0:
req_data['request_status'] = 'processed'
# Save the data
serializer = self.get_serializer(data = req_data)
serializer.is_valid(raise_exception = True)
serializer.save() # `self.perform_create(serializer)` originally
headers = self.get_success_headers(serializer.data)
# Return Response
return Response(
data = serializer.data,
status = status.HTTP_201_CREATED,
headers = headers
)
关键部分是了解您可以通过更改request.data.dict()
的字典来覆盖 API 内部 HTTP POST 中的内容。 然后,您只需在self.get_serializer()
传递该 dict(实际上通常是QueryDict
self.get_serializer()
并遵循标准的create()
方法。
如果您配置editable = False
,则无法以我在此处发布的方式强制更改。 最后可能有更好的方法来做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.