Как получить текущий объект пользователя внутри поля метода 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). Он будет передавать контекст основного сериализатора во вложенный по умолчанию.
Добавьте метод __init__
в ваш сериализатор, чтобы сделать контекст переменной класса. Тогда вы сможете обращаться к контексту, переданному как self.context
в методах сериализатора. Попробуйте добавить следующие строки в класс сериализатора
def __init__(self, *args, **kwargs):
self.context = kwargs.get('context', None)
super(AssessmentListSerializer, self).__init__(*args, **kwargs)
вам все еще следует добавить проверки в ваши методы hasattr(context, 'request'), чтобы избежать любых 500 ошибок.