如果many=true作为参数传递,则无法自定义django序列化程序的响应数据

如果many=true作为参数传递,则无法自定义django序列化程序的响应数据,django,serialization,django-rest-framework,Django,Serialization,Django Rest Framework,如果我传递many=True,我无法为我正在使用的序列化程序自定义响应。数据 下面是我用来序列化组织数据的序列化程序 序列化程序.py class OrganizationSerializer(ModelSerializer): # fields class Meta: model = Organization fields = ('name',) @property def data(self): reques

如果我传递
many=True
,我无法为我正在使用的序列化程序自定义
响应。数据

下面是我用来序列化组织数据的序列化程序

序列化程序.py

class OrganizationSerializer(ModelSerializer):
    # fields

    class Meta:
        model = Organization
        fields = ('name',)

    @property
    def data(self):
        request = self.context['request']
        href = request.build_absolute_uri()  
        ret = super(OrganizationSerializer, self).data        
        # Below i am customizing serializer data based on my specific
        #    requirement. 
        ret = {'href':href, 'items':ret}
        return ReturnDict(ret, serializer=self)
views.py.

# view code ---
organizations = Organization.objects.all()
response = OrganizationSerializer(organizations[0], context={'request':request})
return response.data
我能够以
{'href':'','items':{}]
按照我们的守则

但是当我在下面做的时候-

organizations = Organization.objects.all()
serializer = OrganizationSerializer(organizations, many=True, context={'request':request})
我无法获取response.data作为
{'href':'','items':{}]
。 我希望该响应与我的response.data一起使用或不使用many=True

我查看了serializers.py(django rest app)的源代码,发现如果many=true作为参数传递,那么ListSerializer将用于返回序列化数据

编辑:

型号.py

class Organization(models.Model):
    name = models.CharField(max_length=20)

我认为您可以使用SerializerMethodField格式化数据,然后使用Meta类指定要返回的字段,因此根据您的代码段逻辑,解决方案应如下所示:

    class OrganizationSerializer(ModelSerializer):
        href = serializers.SerializerMethodField()
        items = serializers.SerializerMethodField()

        class Meta:
            model = Users
            fields = ('href', 'items')

        def get_href(self, obj):
            request = self.context['request']
            return request.build_absolute_uri()

        def get_items(self, obj):
            data_list = User.objects.filter(id=obj.id).values()
            return data_list[0]

检查

我已经通过重写
many_init
方法解决了这个问题

class OrganizationSerializer(ModelSerializer):
    # fields

    class Meta:
        model = Organization
        fields = ('name',)

    @property
    def data(self):
        # come into action when.
        # response = OrganizationSerializer(organizations[0], context={'request':request})         
        request = self.context['request']
        href = request.build_absolute_uri()  
        ret = super(OrganizationSerializer, self).data        
        # Below i am customizing serializer data based on my specific
        #    requirement. 
        ret = {'href':href, 'items':ret}
        return ReturnDict(ret, serializer=self)

    @classmethod
    def many_init(cls, *args, **kwargs):
        # come into action when 
        #response = OrganizationSerializer(organizations, many=True, context={'request':request})
        res = super(OrganizationSerializer, cls).many_init(*args, **kwargs)            
        request = kwargs['context']['request']
        href = request.build_absolute_uri()                   
        res.items = {'href': href, 'items': res.data}
        return res

您运行了吗?它给出了:RuntimeError异常值:调用Python对象时超出了最大递归深度。