Как получить текущий объект пользователя внутри поля метода Serializer в Django (при выполнении GET-запроса)?

Ниже приведен мой метод Serialzer, в котором мне нужен текущий объект пользователя для выполнения логики. но он выбрасывает ошибку keyerror 'request'

.

views.py

comments=CommentsOutputSerializer1(results,many=True,context={'request':request})

serialzers.py

def get_can_vote(self,obj):
    user = self.context['request'].user
    print(user)
    if obj.id and user:
        voter_data = CommentVotes.objects.filter(voter=user, comment=obj.id)
    if len(voter_data) > 0:
        return False
    else:
        return True

Вам придется напрямую передать запрос в контексте сериализатора, как показано ниже.

SerializerClass(..., context={'request':request})

Но если вы используете GenericAPIView, это поведение является неотъемлемым, и вы можете обращаться к запросу непосредственно в вашем сериализаторе.

Добавьте контекст в ваш сериализатор.

def get_replys(self, obj):
    queryset = StockUserComments.objects.filter(parent_id=obj.id).order_by('date')
    # Here
    serializer = StockUserCommentsOutputSerializer1(queryset, many=True, context=self.context)
    return serializer.data

Существует множество способов передачи контекста вложенному сериализатору. Если вы используете много экземпляров, проще всего обернуть ваш вложенный сериализатор (CommentsOutputSerializer1 с ListField). Он будет передавать контекст основного сериализатора во вложенный по умолчанию.

https://stackoverflow.com/a/40260330/11354529

Добавьте метод __init__ в ваш сериализатор, чтобы сделать контекст переменной класса. Тогда вы сможете обращаться к контексту, переданному как self.context в методах сериализатора. Попробуйте добавить следующие строки в класс сериализатора

def __init__(self, *args, **kwargs):
    self.context = kwargs.get('context', None)
    super(AssessmentListSerializer, self).__init__(*args, **kwargs)
    

вам все еще следует добавить проверки в ваши методы hasattr(context, 'request'), чтобы избежать любых 500 ошибок.

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