Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python (Django REST)重写(Views)`create`方法中的不可编辑字段_Python_Django_Django Rest Framework - Fatal编程技术网

Python (Django REST)重写(Views)`create`方法中的不可编辑字段

Python (Django REST)重写(Views)`create`方法中的不可编辑字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,在mymodels.py中,我创建了一个用户认为不可编辑的字段: request\u status=models.CharField( 最大长度=100, 默认值='received', 可编辑=假 ) 在views.py文件中,我覆盖create()方法(从generics.ListCreateAPIView和CreateModelMixin超类)以激活docker容器,如果成功完成,我想将request\u status字段修改为类似于container\u activated的内容,然后

在my
models.py
中,我创建了一个用户认为不可编辑的字段:

request\u status=models.CharField(
最大长度=100,
默认值='received',
可编辑=假
)
views.py
文件中,我覆盖
create()
方法(从
generics.ListCreateAPIView
CreateModelMixin
超类)以激活docker容器,如果成功完成,我想将
request\u status
字段修改为类似于
container\u activated
的内容,然后将HTTP响应发送回用户

所以。。。有没有办法修改不可编辑的字段?是否有更好的方法来设置
模型

我的最佳猜测是,有一种方法可以通过标准
create()
方法的一行修改在API DB中注册的数据(不可编辑的字段不会出现在
数据
属性中):

serializer=self.get\u序列化程序(data=request.data)
serializer.is\u有效(raise\u exception=True)
self.perform\u创建(序列化程序)
headers=self.get\u success\u头(serializer.data)

editable=False
并不意味着您不能编辑该字段,它只意味着默认情况下它不会显示在管理或模型表单中。在DRF中,这意味着它将自动设置为
只读
;但是,您可以通过手动定义字段来覆盖它

class MySerializer(serializers.ModelSerializer):
    request_status = serializers.CharField(max_length=100, default='received')
    class Meta:
        ...

这是一种规避,但它或多或少运作良好。我将我的字段改回have
editable=True
,然后我简单地将其强制为默认锁定(硬编码)值。最后,在
views.py
类的
create()

def创建(
自己
要求
*args,
**夸尔斯
):
#POST请求的设置
req_data=request.data.dict()
请求数据['request\u status']=“尚未处理”
#一切都好吗?
如果处理_OK==0:
请求数据[“请求状态”]=“已处理”
#保存数据
serializer=self.get\u序列化程序(data=req\u data)
serializer.is\u有效(raise\u exception=True)
serializer.save()#`self.perform_create(serializer)`
headers=self.get\u success\u头(serializer.data)
#返回响应
返回响应(
data=serializer.data,
status=status.HTTP_201_已创建,
标题=标题
)
关键部分是要理解,您可以通过从
request.data.dict()
更改字典来覆盖API中的HTTP POST内容。然后您只需在
self中传递该dict(通常是
QueryDict
实际上)。获取序列化程序()
并遵循标准的
create()
方法


如果配置
editable=False
,则无法按我在此处发布的方式强制进行更改。最后可能有更好的方法来实现这一点。

但是每次序列化数据时,重写序列化程序中的字段都会这样做,而我想要的是在成功执行特定操作时更改字段,例如。,docker容器的创建——我认为应该在
views.py
create()
方法中进行。不是吗?