Как передать объект запроса из одного класса сериализатора в другой класс сериализатора в 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. Пожалуйста, помогите мне в этом.

Вот два способа достижения этого:

  1. Вы можете использовать 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')
  1. Вы можете переопределить метод __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')

Вернуться на верх