【问题标题】:'RelatedManager' object is not iterable“RelatedManager”对象不可迭代
【发布时间】:2014-09-27 01:57:22
【问题描述】:

在 Django Rest Framework 中,我有以下 json,我正在尝试 PUT

{
    "trgmst_id": 2244, 
    "trgmst_type": 1, 
    "trgmst_name": "evnt_job                      ", 
    "trgmst_desc": null, 
    "trgmst_public": "Y", 
    "trgmst_active": "Y", 
    "trgmst_trigger": 10, 
    "owner_name": "Operations                    ", 
    "trgmst_jobctl": 1, 
    "trgmst_alljobs": "N", 
    "trgmst_lstchgtm": "2014-09-17T16:05:32.463", 
    "trgmst_parm": "OP=0,EX1=1,EX2=1", 
    "trgmst_maxreruns": 0, 
    "nodmst_name": null, 
    "servicemst_name": null, 
    "trgmst_info": null, 
    "trgmst_monitor": 1, 
    "trgmst_trgtskcnt": 0, 
    "trgmst_lasttrgtskrun": null, 
    "event_action_details": [
        {
            "trgtsk_order": 1, 
            "trgtsk_id": 2977, 
            "trgmst_id": 2244, 
            "tskmst_id": null, 
            "trgtsk_type": 1
        }
    ]
}

在提交 PUT 请求时,我得到以下 Traceback -

Traceback:
File "D:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  112.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Python27\lib\site-packages\django\views\generic\base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "D:\Python27\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
  57.         return view_func(*args, **kwargs)
File "D:\Python27\lib\site-packages\rest_framework\views.py" in dispatch
  400.             response = self.handle_exception(exc)
File "D:\Python27\lib\site-packages\rest_framework\views.py" in dispatch
  397.             response = handler(request, *args, **kwargs)
File "D:\Tidal\API\views.py" in put
  204.         if serializer.is_valid():
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in is_valid
  553.         return not self.errors
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in errors
  545.                 ret = self.from_native(data, files)
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in from_native
  996.         instance = super(ModelSerializer, self).from_native(data, files)
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in from_native
  368.             attrs = self.restore_fields(data, files)
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in restore_fields
  283.                 field.field_from_native(data, files, field_name, reverted_data)
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in field_from_native
  472.                 if serializer.is_valid():
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in is_valid
  553.         return not self.errors
File "D:\Python27\lib\site-packages\rest_framework\serializers.py" in errors
  521.                     identities = [self.get_identity(self.to_native(obj)) for obj in objects]

Exception Type: TypeError at /deploy/event/
Exception Value: 'RelatedManager' object is not iterable

这是一个相当简单的视图/序列化器。这是我的序列化程序。请注意,它包含反向关系 -

class EventActionSerializer(serializers.ModelSerializer):

    class Meta:
        model = Trgtsk
        resource_name = 'trgtsk'
        fields = ('trgtsk_order', 'trgtsk_id', 'trgmst_id', 'tskmst_id', 'trgtsk_type')

class EventSerializer(serializers.ModelSerializer):
    owner_name = serializers.Field(source='owner_id.owner_name')
    nodmst_name = serializers.Field(source='nodmst_id.nodmst_name')
    servicemst_name = serializers.Field(source='servicemst_id.servicemst_name')
    event_action_details = EventActionSerializer()

    class Meta:
        model = Trgmst
        resource_name = 'trgmst'
        depth = 1
        fields = ('trgmst_id', 'trgmst_type', 'trgmst_name', 'trgmst_desc', 'trgmst_public', 'trgmst_active',
                'trgmst_trigger', 'owner_name', 'trgmst_jobctl', 'trgmst_alljobs', 'trgmst_lstchgtm', 'trgmst_parm',
                'trgmst_maxreruns', 'nodmst_name', 'servicemst_name', 'trgmst_info', 'trgmst_monitor', 'trgmst_trgtskcnt',
                'trgmst_lasttrgtskrun', 'event_action_details')

视图只是一个标准的 API 视图。当没有与我的任何其他视图相关的模型时,我没有任何问题。

class DeployEventView(APIView):

    def get_object(self, pk):
        try:
            return Trgmst.objects.get(pk=pk)
        except Trgmst.DoesNotExist:
            raise Http404

    def get(self, request, format=None):
        name = self.request.GET.get('name')
        pk = Trgmst.objects.filter(trgmst_name=name).values_list('trgmst_id', flat=True)
        trgmst = self.get_object(pk)
        serializer = EventSerializer(trgmst)
        return Response(serializer.data)

    def put(self, request, format=None):
        name = self.request.GET.get('name')
        pk = Trgmst.objects.filter(trgmst_name=name).values_list('trgmst_id', flat=True)
        trgmst = self.get_object(pk)
        serializer = EventSerializer(trgmst, data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, format=None):
        name = self.request.GET.get('name')
        pk = Trgmst.objects.filter(trgmst_name=name).values_list('trgmst_id', flat=True)
        trgmst = self.get_object(pk)
        trgmst.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    奇怪的是在我的序列化程序中,我在 EventSerializer 中更改了以下行 -

    类 EventActionSerializer(serializers.ModelSerializer):

    class Meta:
        model = Trgtsk
        resource_name = 'trgtsk'
        fields = ('trgtsk_order', 'trgtsk_id', 'trgmst_id', 'tskmst_id', 'trgtsk_type')
    
    class EventSerializer(serializers.ModelSerializer):
        owner_name = serializers.Field(source='owner_id.owner_name')
        nodmst_name = serializers.Field(source='nodmst_id.nodmst_name')
        servicemst_name = serializers.Field(source='servicemst_id.servicemst_name')
        event_action_details = EventActionSerializer
    
        class Meta:
            model = Trgmst
            resource_name = 'trgmst'
            depth = 1
            fields = ('trgmst_id', 'trgmst_type', 'trgmst_name', 'trgmst_desc', 'trgmst_public', 'trgmst_active',
                    'trgmst_trigger', 'owner_name', 'trgmst_jobctl', 'trgmst_alljobs', 'trgmst_lstchgtm', 'trgmst_parm',
                    'trgmst_maxreruns', 'nodmst_name', 'servicemst_name', 'trgmst_info', 'trgmst_monitor', 'trgmst_trgtskcnt',
                    'trgmst_lasttrgtskrun', 'event_action_details')
    

    具体来说,我从event_action_details = EventActionSerializer 行中删除了 (),现在我可以很好地放置 如果对象在两个模型中都存在。如果它是新的,但是它会抱怨 event_action_details.trgmst_id 不存在,如果它尝试同时创建两者就不会存在?

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 2011-10-05
      • 2020-02-17
      • 1970-01-01
      • 2019-11-12
      • 2017-01-05
      • 2015-11-11
      • 2021-06-06
      相关资源
      最近更新 更多