DRF Methodserializer: объект типа <XXX> не сериализуемый JSON

Я пытаюсь преобразовать свой существующий проект в DRF . Однако я столкнулся с ошибкой:

: Object of type TransitionApproval is not JSON serializable

Объект TransitionApproval поступает из пакета под названием django-river. Вот мой код:

class ProjectDetailSerializer(serializers.ModelSerializer):
requirements = CustomerRequirementSerializer(many=True)
transitionApproval = serializers.SerializerMethodField('get_transition_approval')

class Meta:
    model = Project
    fields = '__all__'
    depth = 2

def get_transition_approval(self,project):
    transitions = TransitionApproval.objects.filter(object_id=project.pk).filter(workflow__field_name='project_status')
    print(transitions)
    return transitions

Моя консоль печатает:

<CTEQuerySet [<TransitionApproval: TransitionApproval object (1)>, <TransitionApproval: TransitionApproval object (2)>, <TransitionApproval: TransitionApproval object (3)>]>

Есть хороший способ решить эту проблему? Я пробовал это сделать:

class ProjectDetailSerializer(serializers.ModelSerializer):
requirements = CustomerRequirementSerializer(many=True)
transitionApproval = TransitionSerializer(many=True)

class Meta:
    model = Project
    fields = '__all__'
    depth = 2

но кажется, что "transitionApproval" не является атрибутом Project. Я не знаю, как это решить.

Вот мой просмотр страницы с подробностями

class SalesProjectDetailView(RetrieveAPIView):
queryset = SalesProject.objects.all()
serializer_class = SalesProjectDetailSerializer

редактирует:

Я посоветовал передать набор запросов через сериализатор, прежде чем возвращать его.

class TransitionApprovalSerializer(serializers.ModelSerializer):
    class Meta:
        model = TransitionApproval
        fields = '__all__'    


class ProjectDetailSerializer(serializers.ModelSerializer):
    transitionApproval = serializers.SerializerMethodField('get_transition_approval')

    class Meta:
        model = Project
        fields = '__all__'
        depth = 2

    def get_transition_approval(self,project):
        transitions = TransitionApproval.objects.filter(object_id=project.pk).filter(workflow__field_name='project_status')
        return TransitionApprovalSerializer(transitions).data

Однако это возвращает мне ошибку:

Traceback (most recent call last):

Файл "C: \ Users \ dream \ Desktop \ crmReact \ backend \ react_env \ lib \ site-

packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
    raise exc
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\generics.py", line 208, in get
    return self.retrieve(request, *args, **kwargs)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\mixins.py", line 56, in retrieve
    return Response(serializer.data)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\serializers.py", line 562, in data
    ret = super().data
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\serializers.py", line 260, in data
    self._data = self.to_representation(self.instance)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\serializers.py", line 529, in to_representation
    ret[field.field_name] = field.to_representation(attribute)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\fields.py", line 1905, in to_representation
    return method(value)
  File "C:\Users\dream\Desktop\crmReact\backend\backend\sales\api\serializers.py", line 205, in get_transition_approval
    return TransitionApprovalSerializer(transitions).data
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\serializers.py", line 562, in data
    ret = super().data
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\serializers.py", line 260, in data
    self._data = self.to_representation(self.instance)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\serializers.py", line 516, in to_representation
    attribute = field.get_attribute(instance)
  File "C:\Users\dream\Desktop\crmReact\backend\react_env\lib\site-packages\rest_framework\fields.py", line 487, in get_attribute
    raise type(exc)(msg)
AttributeError: Got AttributeError when attempting to get a value for field `object_id` on serializer `TransitionApprovalSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `CTEQuerySet` instance.
Original exception text was: 'CTEQuerySet' object has no attribute 'object_id'.

object_id - это поле объекта TransitionApproval, но я думаю, что сериализатор принимает набор запросов как сам объект

1 ответ

Решение

Вы можете получить эту ошибку, потому что ваш get_transition_approval метод возвращает набор запросов TransitionApproval.Querysets не могли напрямую сериализоваться в json. Вы должны вернуть сериализованные данные из этого метода. Вы можете создать еще один сериализатор и сериализовать свои данные с помощью этого сериализатора следующим образом:

class TransitionApprovalSerializer(serializers.ModelSerializer):#your new serializer
    class Meta:
        model = TransitionApproval
        fields = [...]


class ProjectDetailSerializer(serializers.ModelSerializer):
    ....
    def get_transition_approval(self,project):
        transitions = TransitionApproval.objects.filter(object_id=project.pk).filter(workflow__field_name='project_status')
        # you can serialize your data here
        return TransitionApprovalSerializer(transitions).data
Другие вопросы по тегам