#django #django-rest-framework
#django #django-rest-framework
Вопрос:
Я пытаюсь вернуть объект с дополнительной информацией после входа пользователя в систему.
class CustomAuthToken(ObtainAuthToken):
def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data, context={'request': request})
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
token, created = Token.objects.get_or_create(user=user)
player = Player.objects.get(id=user.pk)
return Response({
'token': token.key,
'user_id': user.pk,
'email': user.email,
'full_user_info': player, # Object of type Player is not JSON serializable
})
Я пробовал dict(player)
, но затем ошибка гласит TypeError: 'Player' object is not iterable
Ответ №1:
Создайте сериализатор модели проигрывателя
class PlayerSerializer(serializers.ModelSerializer):
class Meta:
model = Player
fields = "__all__"
А затем используйте сериализатор в своем ответе:
{
# other fields
"full_user_info": PlayerSerializer(data=Player)
}
Комментарии:
1.
raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type PlayerSerializer is not JSON serializable
2. новая проблема, и я не знаю, как это сделать:
AssertionError: When a serializer is passed a `data` keyword argument you must call `.is_valid()` before attempting to access the serialized `.data` representation. You should either call `.is_valid()` first, or access `.initial_data` instead.
3. Если вы хотите быть уверены, что ваши данные сериализатора действительны, вам следует использовать serialized.is_valid() перед использованием serializer.data . В противном случае, если я не ошибаюсь, удалите ключевое слово data из serializer PlayerSerializer(Player) и используйте его напрямую (serializer.data)