如何将请求对象从一个序列化器 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。请帮助我。
这里有两种实现方式:
- 您可以使用
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')
- 您可以覆盖
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')
我想访问当前登录用户的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。请帮助我。
这里有两种实现方式:
- 您可以使用
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')
- 您可以覆盖
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')