Django REST框架 - Serialize ForeignKey字段

时间:2014-02-03 17:57:53

标签: python django serialization django-rest-framework

在我的应用中,用户有一面墙,类似于旧的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是注释本身。

创建/编辑评论时,需要由后端设置uiduidcommenter。不允许用户更改这些字段。

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

我尝试使用uid设置uidcommenterSerializerMethodField(在上下文变量中传递PK),但数据库说我正在传递NULL PK:

class UserWallCommentSerializer(serializers.ModelSerializer):
    uid = serializers.SerializerMethodField('setUid')
    class Meta:
        model = UserWallComment
        fields = ('uid', 'uidcommenter', 'idwall', 'created', 'description')
        read_only_fields = ('uidcommenter', 'idwall', 'created')
def setUid(self):
    return self.context['uid']

我的观看代码(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)

1 个答案:

答案 0 :(得分:1)

文档说明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
    }

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

访问

我没试过,但它应该有用。