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

时间:2019-07-19 12:59:46

标签: python django django-rest-framework

在我的conda config --append channels <channel-name> 中,我创建了一个用户不可编辑的字段:

models.py

request_status = models.CharField( max_length = 100, default = 'received', editable = False ) 文件中,我覆盖了views.pycreate()超类的generics.ListCreateAPIView方法来激活docker容器,如果成功完成,我想将CreateModelMixin字段修改为类似request_status的内容,然后将HTTP响应发送回用户。

那么...有没有办法修改不可编辑的字段?有没有更好的方法来设置container_activated

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

create()

2 个答案:

答案 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,则无法以我在此处发布的方式来强制进行更改。最后可能有更好的方法。