如何将请求对象从一个序列化器 class 传递到 Django 中的另一个序列化器 class

How to pass request object from one serializer class to other serializer class in Django

我想访问当前登录用户的userId。为此,我需要将请求对象从一个序列化程序传递到另一个序列化程序。这是我的代码

class ThreadViewSerializer(serializers.ModelSerializer):
op = PostDetailViewSerializer(context={'request': request})

class Meta:
    model = Thread
    fields = ('id', 'title', 'op', 'group_id', 'type', 'reference_id', 'is_frozen', 'views', 'is_pinned')

在 PostDetailViewSerializer 中,我想传递请求对象,但为此它需要自身对象。像这样

request = self.context.get('request')

因此,我们如何将请求对象传递给 ThreadViewSerializer class 中的 PostDetailViewSerializer class。请帮助我。

这里有两种实现方式:

  1. 您可以使用 SerializerMethodField 访问 self.context(请记住,这是一个 read-only 序列化程序):
class ThreadViewSerializer(serializers.ModelSerializer):
    op = serializers.SerializerMethodField()

    def get_op(self, instance):
        return PostDetailViewSerializer(instance=instance.op, context=self.context).data

    class Meta:
        model = Thread
        fields = ('id', 'title', 'op', 'group_id', 'type', 'reference_id', 'is_frozen', 'views', 'is_pinned')
  1. 您可以覆盖 ThreadViewSerializer__init__ 方法并将上下文传递到您的字段:
class ThreadViewSerializer(serializers.ModelSerializer):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['op'] = PostDetailViewSerializer(context=self.context)

    class Meta:
        model = Thread
        fields = ('id', 'title', 'op', 'group_id', 'type', 'reference_id', 'is_frozen', 'views', 'is_pinned')