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

时间:2015-04-29 06:32:43

标签: python django django-rest-framework

我的表单会将数据发布到db。

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

我的帖子功能是

        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视图中显示,但是通过发布代码提交表单仍然是空的

2 个答案:

答案 0 :(得分:3)

其实这一行

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

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

检查
print type(request.data)

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

为了达到您想要的效果,您可以转移您的代码'字段生成到序列化器的方式如下。

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()

答案 1 :(得分:0)

问题在于您将设置为仅读取和文档说它将无法用于设置值:

  

将此属性设置为True可确保在序列化表示时使用该字段,但在反序列化期间创建或更新实例时不使用该字段。

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

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