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()
我的表格将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()