如果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对象时超出了最大递归深度。