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

How do we add and save additional parameters to a serializer object in django rest framework?

这些是我的 PostSerializer 中的字段

fields = ('id','user_id','title','desc','comments')

user_idcomments是代码生成的,titledesc是从api调用中获得的。我想将其作为附加值传递给我的 request.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)

而我的 print(request.data) 显示 user_idcomments 字段及其对应的值。在保存的数据库中 user_idcomments 的值是 null.

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

方法一
您可以将其他字段传递给 serializer.save(),如下所示:

class PostView(APIView):
    permission_classes = (IsAuthenticated,) 
    def post(self,request):
        post_serializer = PostSerializer(data=request.data)
        if post_serializer.is_valid():
            post_serializer.save (
            
            user_id=request.user_id,
            comments="machine generated"
            
            )
            return Response(post_serializer.data)

但是通过这个方法,你应该让<em>blank=True</em> for <em>user_id</em><em>评论</em>以使序列化程序有效。

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

class PostView(APIView):
    permission_classes = (IsAuthenticated,) 
    def post(self,request):
        data = dict(request.data)
        data['user_id'] = request.user.id
        data['comments'] = "machine generated"

        post_serializer = PostSerializer(data=data)
        if post_serializer.is_valid():
            post_serializer.save()
            return Response(post_serializer.data)


方法三
您可以使用 .update() 方法更改 request.data 而不会从客户端丢失数据:

class PostView(APIView):
    permission_classes = (IsAuthenticated,) 
    def post(self,request):
        request.data.updata ( {

            'user_id': request.user.id,
            '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)