Django Rest Framework — как вернуть всю информацию из модели в ответе, когда получаемый объект типа model не является сериализуемым в формате JSON?

#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)