将根元素添加到JSON响应中(django-rest-framework)

我正在尝试确定使用django和django-rest-framework将根元素添加到所有json响应的最佳方法。

我认为添加自定义渲染器是完成我想要实现的最好的方法,这是我到目前为止提出的:

from rest_framework.renderers import JSONRenderer

class CustomJSONRenderer(JSONRenderer):

#override the render method

def render(self, data, accepted_media_type=None, renderer_context=None):

#call super, as we really just want to mess with the data returned

json_str = super(CustomJSONRenderer, self).render(data, accepted_media_type, renderer_context)

root_element = 'contact'

#wrap the json string in the desired root element

ret = '{%s: %s}' % (root_element, json_str)

return ret

现在,棘手的部分是root_element根据render()要从其调用的视图动态设置。

任何指示/建议将不胜感激,

回答:

对于后代,以下是最终解决方案。由于它现在也重新设置了分页结果的格式,因此与原始版本相比略有增长。

我之前也应该指定,JSON根元素的原因是与Ember前端解决方案集成。

serializer:

from rest_framework.serializers import ModelSerializer

from api.models import Contact

class ContactSerializer(ModelSerializer):

class Meta:

model = Contact

#define the resource we wish to use for the root element of the response

resource_name = 'contact'

fields = ('id', 'first_name', 'last_name', 'phone_number', 'company')

renderer:

from rest_framework.renderers import JSONRenderer

class CustomJSONRenderer(JSONRenderer):

"""

Override the render method of the django rest framework JSONRenderer to allow the following:

* adding a resource_name root element to all GET requests formatted with JSON

* reformatting paginated results to the following structure {meta: {}, resource_name: [{},{}]}

NB: This solution requires a custom pagination serializer and an attribute of 'resource_name'

defined in the serializer

"""

def render(self, data, accepted_media_type=None, renderer_context=None):

response_data = {}

#determine the resource name for this request - default to objects if not defined

resource = getattr(renderer_context.get('view').get_serializer().Meta, 'resource_name', 'objects')

#check if the results have been paginated

if data.get('paginated_results'):

#add the resource key and copy the results

response_data['meta'] = data.get('meta')

response_data[resource] = data.get('paginated_results')

else:

response_data[resource] = data

#call super to render the response

response = super(CustomJSONRenderer, self).render(response_data, accepted_media_type, renderer_context)

return response

pagination:

from rest_framework import pagination, serializers

class CustomMetaSerializer(serializers.Serializer):

next_page = pagination.NextPageField(source='*')

prev_page = pagination.PreviousPageField(source='*')

record_count = serializers.Field(source='paginator.count')

class CustomPaginationSerializer(pagination.BasePaginationSerializer):

# Takes the page object as the source

meta = CustomMetaSerializer(source='*')

results_field = 'paginated_results'

以上是 将根元素添加到JSON响应中(django-rest-framework) 的全部内容, 来源链接: utcz.com/qa/398413.html

回到顶部