繁体   English   中英

(Django REST)覆盖(视图)`create` 方法中的不可编辑字段

[英](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.ListCreateAPIViewCreateModelMixin超类)以激活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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM