Сериализатор Django, требующий дикт вместо экземпляра модели
Я пытаюсь сделать действительно простую сериализацию в viewset в django, но мой сериализатор, который должен требовать экземпляр для сериализации, требует dict.
Это мой пользовательский сериализатор:
А это мой ViewSet
:
class JSONAPIModelViewSet(viewsets.ViewSet, GenericAPIView):
"""
A viewset designed to implement the JSON:API spec by default.
"""
serializer_class: serializers.Serializer = None
filterset_class: django_filters.FilterSet = None
pagination_class = JSONAPILimitOffsetPagination
lookup_field = "id"
def __init__(self, *args, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
def get_queryset(self):
return self.serializer_class.Meta.model.objects.all()
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
if serializer.is_valid():
return Response(serializer.data)
return Response(serializer.errors)
class AnimeViewSet(JSONAPIModelViewSet):
serializer_class = AnimeSerializer
filterset_class = AnimeFilter
relationships = ['characters', 'staff']
Однако, когда я пытаюсь сделать запрос к представлению retrieve
, я получаю следующий ответ:
{
non_field_errors: [
"Invalid data. Expected a dictionary, but got Anime."
]
}
Я попробовал заменить self.get_serializer(instance)
на self.get_serializer(data={})
, но теперь экземпляр, передаваемый в to_representation
в сериализаторе, является экземпляром самого себя. Я пробовал поднимать ошибки, чтобы увидеть, где код остановился, и исключение поднимается при проверке is_valid()
. Если я делаю is_valid(raise_exception=False)
, я получаю пустой JSON в качестве ответа. Я даже пытался явно поставить AnimeSerializer
вместо self.get_serializer()
, но это бесполезно.
Как я могу заставить его принимать экземпляр в качестве фактического параметра данных и перестать требовать диктант?
Edit: Это происходит только с видом retrieve
, с видом list
все работает нормально.