【问题标题】:Django REST Framework - Serialize ForeignKey fieldsDjango REST 框架 - 序列化 ForeignKey 字段
【发布时间】:2014-02-03 17:57:53
【问题描述】:

在我的应用中,用户有一堵墙,类似于旧的 Facebook 墙。一个用户可以在其他用户的墙上发布 cmets。我有一个基本结构如下的序列化程序:

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?

我尝试使用SerializerMethodField 设置uid 和uidcommenter(在上下文变量中传递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)

【问题讨论】:

  • 您使用的是 DRF 的通用视图吗?可以发一下查看代码吗?
  • OFC!我已经发布了post的视图代码。

标签: python django serialization django-rest-framework


【解决方案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

我没有尝试过,但应该可以。

【讨论】:

  • 你是对的,覆盖 save 方法会提供一个解决方案。我可以从那里访问上下文变量,并手动添加 uid 和 uidcommenter。然而,我最终得到的解决方案是简单地修改传入的 POST 数据。数据仅包含description 变量,而我认为手动添加uid 和uidcommenter。我发现这种方法是最简单的,也很容易理解。谢谢你的回答!
猜你喜欢
  • 2016-06-22
  • 2017-03-25
  • 2018-10-14
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
相关资源
最近更新 更多