Как передать объект запроса из одного класса сериализатора в другой класс сериализатора в 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 я хочу передать объект запроса, но для этого он требует объект self. вот так
request = self.context.get('request')
Так, Как мы можем передать объект запроса в класс PostDetailViewSerializer в классе ThreadViewSerializer. Пожалуйста, помогите мне в этом.
Вот два способа достижения этого:
- Вы можете использовать
SerializerMethodFieldдля доступа кself.context(имейте в виду, что это сериализатор только для чтения):
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')
- Вы можете переопределить метод
__init__вашегоThreadViewSerializerи передать контекст вашим полям:
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')