在我的应用中,用户有一面墙,类似于旧的Facebook墙。用户可以在其他用户墙上发布评论。我有一个像这样的基本结构的序列化器:
class UserWallCommentSerializer(serializers.ModelSerializer):
class Meta:
model = UserWallComment
fields = ('uid', 'uidcommenter', 'idwall', 'created', 'description')
read_only_fields = ('uid', 'uidcommenter', 'idwall', 'created')
uid
和uidcommenter
是用户模型的外键,idwall
是PK,description
是注释本身。
创建/编辑评论时,需要由后端设置uid
和uidcommenter
。不允许用户更改这些字段。
假设我的视图中有变量uid
和uidcommenter
正在调用序列化程序 - 如何将这些变量传递给序列化程序以便创建UserWallComment?
我尝试使用uid
设置uidcommenter
和SerializerMethodField
(在上下文变量中传递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)
答案 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
我没试过,但它应该有用。