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

2024-04-20 04:06:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

request_status = models.CharField(
    max_length = 100,
    default = 'received', 
    editable = False
)

views.py文件中,我重写了create()方法(来自generics.ListCreateAPIViewCreateModelMixin超类)来激活docker容器,如果成功的话,我想将request_status字段修改为类似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)

Tags: 方法用户pyself编辑datagetmodels
2条回答

editable=False并不意味着你不能编辑这个字段,它只意味着默认情况下它不会出现在admin或modelforms中。在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内部的httppost中的内容。然后您只需在self.get_serializer()内传递dict(实际上通常是QueryDict),并遵循标准的create()方法。你知道吗

如果您配置editable = False,您就不能以我在这里发布的方式强制更改。最后可能还有更好的办法。你知道吗

相关问题 更多 >