我们如何在django rest框架中向序列化程序对象添加和保存其他参数?

我们如何在django rest框架中向序列化程序对象添加和保存其他参数?,django,django-rest-framework,django-views,django-authentication,django-serializer,Django,Django Rest Framework,Django Views,Django Authentication,Django Serializer,这些是我的PostSerializer中的字段 fields = ('id','user_id','title','desc','comments') 生成用户id和注释,并从api调用中获取标题,描述。我想将其作为附加值传递给我的请求.data。这是我的APIView对象 class PostView(APIView): permission_classes = (IsAuthenticated,) def post(self,request): reque

这些是我的PostSerializer中的字段

fields = ('id','user_id','title','desc','comments')
生成
用户id
注释
,并从api调用中获取
标题
描述
。我想将其作为附加值传递给我的
请求.data
。这是我的APIView对象

class PostView(APIView):
    permission_classes = (IsAuthenticated,) 
    def post(self,request):
        request.data['user_id'] = request.user.id
        request.data['comments'] = "machine generated"
        post_serializer = PostSerializer(data=request.data)
        if post_serializer.is_valid():
            post_serializer.save()
            print(request.data)
            return Response(post_serializer.data)
当我的
打印(request.data)
显示
用户id
注释
字段及其相应值时。在保存的数据库中,
user\u id
comments
的值为
null


如何在django rest framework中向序列化程序对象添加和保存其他参数?

方法1
您可以将其他字段传递给
序列化程序.save()
,如下所示:

类后视图(APIView):
权限\类=(已验证,)
def post(自我,请求):
post_serializer=PostSerializer(data=request.data)
如果post_序列化程序.是否有效():
post_serializer.save(
user\u id=request.user\u id,
comments=“机器生成”
)
返回响应(post_serializer.data)
但是通过此方法,您应该为
用户id
设置
blank=True
注释以使序列化程序有效。

方法2
我不确定此方法是否正确,但我建议您不要更改
request.data
。 首先复制它,然后对新字典进行更改。详情如下:

类后视图(APIView):
权限\类=(已验证,)
def post(自我,请求):
data=dict(request.data)
数据['user_id']=request.user.id
数据['comments']=“已生成机器”
post_serializer=PostSerializer(数据=数据)
如果post_序列化程序.是否有效():
post_序列化程序.save()
返回响应(post_serializer.data)

方法3
您可以使用
.update()
方法更改
请求.data
,而不会丢失客户端的数据:

类后视图(APIView):
权限\类=(已验证,)
def post(自我,请求):
request.data.updatea({
“用户id”:request.user.id,
“注释”:“已生成计算机”
} )
post_serializer=PostSerializer(data=request.data)
如果post_序列化程序.是否有效():
post_序列化程序.save()
打印(请求数据)
返回响应(post_serializer.data)

也共享您的PostSerialier和模型代码,谢谢。谢谢,方法1可以工作,但方法2和方法3不能。你能告诉我我的方法失败的原因吗?我不确定。如果我有你的PostSerializer和Post模型,也许我可以帮你。