Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django DRF Methodserializer:类型为<;的对象;XXX>;JSON不可序列化_Django_Django Rest Framework_Django River - Fatal编程技术网

Django DRF Methodserializer:类型为<;的对象;XXX>;JSON不可序列化

Django DRF Methodserializer:类型为<;的对象;XXX>;JSON不可序列化,django,django-rest-framework,django-river,Django,Django Rest Framework,Django River,我正在尝试将现有项目转换为DRF。然而,我面临的错误是: : Object of type TransitionApproval is not JSON serializable Traceback (most recent call last): TransitionApproval对象来自一个名为django river的包。这是我的密码: class ProjectDetailSerializer(serializers.ModelSerializer): requirements =

我正在尝试将现有项目转换为DRF。然而,我面临的错误是:

: Object of type TransitionApproval is not JSON serializable
Traceback (most recent call last):
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 SalesProjectDetailView(RetrieveAPIView):
queryset = SalesProject.objects.all()
serializer_class = SalesProjectDetailSerializer
编辑: 我建议在返回queryset之前将其通过序列化程序

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
但是,这会返回一个错误:

: Object of type TransitionApproval is not JSON serializable
Traceback (most recent call last):
文件“C:\Users\dream\Desktop\crmReact\backend\react\u 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\u id是TransitionApproval对象的一个字段,但我认为序列化程序将queryset作为对象本身

您可能会遇到此错误,因为您的
get\u transition\u approval
方法返回queryset
TransitionApproval
。queryset无法直接序列化为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

您试图在何处使用此数据?我试图在我的项目详细信息页面中使用此数据如果您想使用TransitionApproval数据进行响应,您需要使用序列化程序来覆盖它。您现在尝试在此处返回对象而不是json
返回transitions
。Exp:您可以创建TransitionSerializer。并返回
TransitionSerializer(转换,多个=真).data
。或者完全删除methodfield并将其替换为TransitionSerializerHello。在这里,我尝试了上述方法,但似乎出现了一个新错误:“CTEQuerySet”对象没有属性“object\u id”。我在TransitionalApprovalSerializer中使用了所有内容。似乎不是从对象本身获取字段,而是获取属性我传入的查询集中的字段,你知道如何修复吗?我想你的
TransitionApproval
模型中有
object\u id
字段。它抛出了这个错误。你有这个字段吗?是的,它肯定是我的TransitionApproval模型中的一个字段,我实际上运行了一个循环来提取每个对象并打印出我想要的对象d返回了正确的值它似乎试图从“CTESet”对象而不是TransitionApproval对象中提取对象id字段,但如果您不需要此字段,则可以在
TransitionApprovalSerializer
中使用
排除=['object\u id']
更改
字段='\uuuuuuuuu'