Django REST框架序列化ForeignKey字段

2024-03-29 07:45:17 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的应用程序中,用户有一面墙,类似于以前的Facebook墙。用户可以在其他用户的墙上发表评论。我有一个基本结构如下的序列化程序:

class UserWallCommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserWallComment
        fields = ('uid', 'uidcommenter', 'idwall', 'created', 'description')
        read_only_fields = ('uid', 'uidcommenter', 'idwall', 'created')

uiduidcommenter是用户模型的外键,idwall是PK,description是注释本身。在

创建/编辑注释时,uid和{}需要由后端设置。不允许用户更改这些字段。在

假设我的视图中有变量uiduidcommenter正在调用序列化程序-如何将这些变量传递给序列化程序,以便创建UserWallComment?在

我尝试过使用SerializerMethodField(在上下文变量中传递PK)来设置uid和{},但是数据库显示我传递的是空PK:

^{pr2}$

我的视图代码(idwall是墙的pk):

class MemberWall(APIView):
    def post(self, request, requestUid, idwall):
        uid = request.user.uid
        serializer = UserWallCommentSerializer(data=request.DATA, context={'uid': requestUid, 'uidcommenter': uid})

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data['uid'], status=status.HTTP_201_CREATED)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Tags: 用户程序fieldsuid序列化requeststatusclass
1条回答
网友
1楼 · 发布于 2024-03-29 07:45:17

文档中说SerializerMethodField只用于representation of the object。这意味着只有当您将数据作为响应返回时才使用它。在

默认情况下,序列化程序获取传递的请求:

def get_serializer_context(self):
    """
    Extra context provided to the serializer class.
    """
    return {
        'request': self.request,
        'format': self.format_kwarg,
        'view': self
    }

这意味着您可以覆盖de default save,更新serializer的方法并设置相关字段。您应该可以使用:self._context.request.user.uid

我没试过,但应该行得通。在

相关问题 更多 >