在我的conda config --append channels <channel-name>
中,我创建了一个用户不可编辑的字段:
models.py
在request_status = models.CharField(
max_length = 100,
default = 'received',
editable = False
)
文件中,我覆盖了views.py
和create()
超类的generics.ListCreateAPIView
方法来激活docker容器,如果成功完成,我想将CreateModelMixin
字段修改为类似request_status
的内容,然后将HTTP响应发送回用户。
那么...有没有办法修改不可编辑的字段?有没有更好的方法来设置container_activated
?
我的最佳猜测是,有一种方法可以通过标准model
方法的其中一行来修改在API DB中注册的数据(不可编辑字段不会出现在{{1 }}属性):
create()
答案 0 :(得分:0)
editable=False
并不意味着您根本无法编辑该字段,而仅意味着默认情况下它不会显示在管理员或模型表单中。在DRF中,这意味着它将自动设置为read_only
;但是您可以通过手动定义字段来覆盖它。
class MySerializer(serializers.ModelSerializer):
request_status = serializers.CharField(max_length=100, default='received')
class Meta:
...
答案 1 :(得分:0)
这是一种规避措施,但它或多或少都运作良好。我将字段改回为editable = True
,然后我只是强迫它为默认的锁定(硬编码)值。最后,在create()
类的views.py
内,放置了以下内容:
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的内容。然后,您只需在QueryDict
内部传递该字典(实际上通常是self.get_serializer()
)并遵循标准的create()
方法即可。
如果配置editable = False
,则无法以我在此处发布的方式来强制进行更改。最后可能有更好的方法。