当前位置: 首页 > 面试题库 >

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

裴甫
2023-03-14
问题内容

我正在尝试确定使用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'


 类似资料:
  • 问题内容: 我正在尝试将元素添加到python中的json文件中,但我无法做到这一点。 这是我直到现在尝试的内容(删除了一些变化): 但是,我得到的是: 很好,因为我还需要添加一个新行而不是一个元素,但是我想得到这样的东西: 我应该如何添加新元素? 问题答案: 你可以这样做。

  • 问题内容: 我正在为QuerySet中的每个项目生成聚合: 但是我没有得到JSON响应中的计数。 问题答案: 从get_queryset返回的queryset提供了将要通过序列化程序的内容的列表,该序列化程序控制对象的表示方式。尝试在Book序列化器中添加其他字段,例如: 编辑:正如其他人所说,这不是返回许多结果的情况下增加计数的最有效方法,因为它将对每个实例命中数据库。有关更有效的解决方案.

  • 我有个文件名测试。json 我读了这个文件,我想得到这个 我要阅读和构建的代码 从JSON的那句话中,我得到了 com.google.gson.stream.MalformedJsonException:使用JsonReader.setLenient(true)接受格式错误的JSON 我的绳子坏了? 我试过了 我知道这不是JSON数组。

  • 问题内容: 我已经有了一个状态: 现在,我想用新信息对其进行更新。因此,向其添加另一个div。 像这样: 我该怎么做?或者我需要从零开始设置新状态 问题答案: 我认为以组件状态存储jsx组件不是一个好主意。我认为您应该仅以呈现组件所需的状态保存数据。 如果您真的想在状态中存储jsx,为什么不将“对话”属性定义为数组?然后,您可以向其中添加新组件。 但是最好只存储数据,例如“ first”和“ ne

  • 问题内容: 我有一个单击按钮时执行的功能。假设有一个循环将1到10加到。我将该数据添加到中。它完美地工作,并且数字相加。然后我在循环中添加了一个。但是输出是不同的。我想每秒增加1个元素。但是现在它等待10秒,并在第10秒结束时将所有1到10加在一起。我在哪里错了? 问题答案: 您应该在单独的线程中更新列表,否则最终将阻塞事件分发线程。 请尝试以下操作:

  • 我正在学习HeadFirst Android开发的教程,在添加了以下内容后遇到了一些问题:private ActionBarDrawerToggle drawertoggle; 错误:任务“:app:ProcessDebugManifest”执行失败。 清单合并失败:来自[com.android.support:RecyclerView-V7:25.3.1]androidManifest.xml: