Django Rest 在 Post 的 django 视图上设置一些新值

Django Rest Set some new value on django view on Post

我的表格将post数据到数据库。

我想添加一个隐藏在视图中的文件,它应该随机生成一个密钥。

我的post函数是

        def post(self, request, format=None):
            request.data['code'] = id_generator()
            data = request.data
            serializer = registrationform(data=data)
            if serializer.is_valid():
                serializer.save()
                x=serializer.data
                data = { "ack":"success"}
                return Response(data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

此处 id_generator() 将生成一些随机值。

在序列化器中

class regiform(serializers.ModelSerializer):
    code = serializers.CharField(read_only=True)

    class  Meta:
        fields = ( 'mobile', 'profile_image', 'code')
        model = registration

所以现在提交的代码没有显示在 API 视图中,但是通过 post 提交表单代码仍然是空的

问题是您设置为只读,文档说它不能用于设置值:

Set this to True to ensure that the field is used when serializing a representation, but is not used when creating or updating an instance during deserialization.

因此,如果您想隐藏它,可以在 CharField 中使用允许的样式标签,例如:serializers.CharField(style={'input_type':'hidden'})

建议:您应该使用 HiddenField 而不是 CharField,因为 HiddenField 从可调用值或默认值中获取值,这似乎是您想要执行的操作。

实际上这一行

request.data['code'] = id_generator()

不会更新您的 request.data。您通过假设 request.data 是字典来编写此行,它将使用新的字段代码更新您的字典。事实是 request.data 是 QueryDict。通过

检查
print type(request.data)

它不会以这种方式更新新字段。

为了实现你想要的,你可以通过以下方式将你的 'code' 字段生成传输到序列化程序。

def post(self, request, format=None):
            serializer = registrationform(data=request.data)
            if serializer.is_valid():
                serializer.save()
                x=serializer.data
                data = { "ack":"success"}
                return Response(data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

在序列化器中

class regiform(serializers.ModelSerializer):
     code = serializers.SerializerMethodField()

     class  Meta:

          fields = ( 'mobile', 'profile_image',)
          model = registration

     def get_code(self, obj):
          return id_generator()