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

2024-02-10

我正在尝试确定使用 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()正在被呼叫。

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

Cheers


对于后人来说,以下是最终的解决方案。它比原来的版本略有增长,因为它现在也重新格式化了分页结果。

另外,我之前应该已经指出,JSON 根元素的原因是为了与 Ember 前端解决方案集成。

序列化器:

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')

渲染器:

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

分页:

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'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将根元素添加到 json 响应 (django-rest-framework) 的相关文章

随机推荐

  • 帮我用“apply”函数替换 for 循环

    如果可能的话 我的任务是找到用户连续参与游戏的最长连续天数 我没有编写 sql 函数 而是选择使用 R 的 rle 函数来获取最长的条纹 然后用结果更新我的数据库表 附加的 数据框是这样的 day user id 2008 11 01 20
  • 日语字符的正则表达式

    我正在 Struts 中进行国际化 我想为日语和英语用户编写 Javascript 验证 我知道英语的正则表达式 但不知道日语用户的正则表达式 是否可以为两个用户编写一个基于 Unicode 进行验证的正则表达式 请帮我 下面是一个正则表达
  • Prolog 中的递归 - 寻找城市之间的路径

    我正在努力完成底部的练习我发现自己对第三点完全困惑 我们获得以下旅游信息知识库 byCar auckland hamilton byCar hamilton raglan byCar valmont saarbruecken byCar v
  • 使用 Zombie.js 验证 Qunit 的结果

    我正在进行测试驱动开发Qunit http qunitjs com 当创建一个新函数时 我为它编写测试 创建函数 重新加载页面 如果所有测试都通过 我就继续 虽然一开始工作正常 但之后它开始成为一个耗时的过程一段时间 因为所有测试都需要几秒
  • 如何在另一个线程上运行阻塞代码并使http请求立即返回

    我们开始了一个新项目Quarkus and Mutiny 并使用 Quarkus 创建了一堆端点 Funq 到目前为止一切都运行良好 现在我们想要在一个端点中处理一些非常耗时的事情 我们期望的是 一旦用户单击按钮从前端发送 http 请求并
  • Javascript 中的递归函数和深度跟踪

    我正在用 JS 编写一个递归函数 但遇到了一些麻烦 让我们从这个非常基本的函数开始 function traverse thing if typeof traverse depth undefined traverse depth 1 el
  • Python 中的“For”循环行为

    为什么下面的简单循环没有保存i在循环的末尾 for i in range 1 10 print i i i 3 以上打印 1 2 3 4 5 6 7 8 9 但它应该打印 1 4 7 for sets i每次迭代 到被迭代对象的下一个值 无
  • 运行 `yo angular` 时出现很多“npm ERR!”

    我正在努力让 Yeoman 工作 但是却是一堵又一堵墙 感谢上帝的 stackoverflow 和所有好心人的帮助 无论如何 我一直在努力奔跑yo angular 但我得到了一堆npm ERR 包括 npm ERR Please try r
  • Plotly:如何在 x 轴上绘制月份和日期? (忽略年份)

    我正在尝试绘制时间序列数据 并希望 x 轴只是月份和日期 Plotly 要求格式为yyyy mm dd 但我有几年来数据集的每日平均值 所以我只想绘制mm dd在 x 轴上 当我发送一个日期时间时mm dd它假设mm成为那一年 我可以让它绕
  • 自定义适配器 getView 方法在位置 0 处频繁调用

    我有一个 GridView 绑定到自定义 ArrayAdapter 派生
  • Rails jquery 日期选择器时区

    我在尝试使用 Rails 处理 JQuery 日期 时间选择器中的时区时遇到问题 日期选择器正确显示当地时区 问题出现了 当我将所选日期保存到数据库中时 rails 会将其保存为 UTC 时间 即使该时间位于客户端的时区中 当我尝试将时间转
  • 如何包含 头文件并使用 std::numbers

    在 gcc 和 g 版本 11 1 0 上运行 每次我运行这段代码时 我都会遇到问题 它说 std numbers 未声明 我尝试跑步g randomCodeWhileReading cpp o main std c 20在我的终端 我运行
  • 具有大数据集的 DC 和交叉过滤器

    我一直在研究 dc 和 crossfilter js 目前有一个包含 550 000 行 大小为 60mb csv 的大型数据集 并且面临着很多问题 例如浏览器崩溃等 因此 我试图了解 dc 和 crossfilter 如何处理大型数据集
  • 通过 JNI 从 C++ 调用返回字符串的 java 函数 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 应用程序中访问 Java 方法 https stackoverflow com questions 992836 how to access the java method in a c
  • 当 __builtin_memcpy 替换为 libc 的 memcpy 时

    有一个C99 posix版本memcpy海湾合作委员会的功能 builtin memcpy 有时它可以被 GCC 替换为 memcpy 的内联版本 而在其他情况下它可以通过调用 libc 的 memcpy 来替换 例如 有人指出here h
  • MVC2 <%: 标签与 <%= 有何不同

    区别在于 在 MVC2 出现之前 为了对字符串进行 HTML 编码 您必须在视图中使用 Html Encode 方法 然而 在 MVC2 中 他们添加了 根据经验 你应该always使用 查看顾斯科特的博客 http weblogs asp
  • 获取控件相对于整个屏幕的位置?

    假设我有一个 Control 它的位置是相对于它的父级的 如果它嵌入了很多次并且是主窗体的曾曾孙 我如何确定它在整个屏幕上的位置 而不仅仅是它在直接父窗体中的位置 这是为了通过屏幕截图打印特定控件 因为对于某些控件 DrawToBitmap
  • Apple 配置不再适用于 Visual Studio 2022 17.2

    我打算在 Visual Studio 2022 中下载更新的 Apple 开发人员证书和配置文件 新的证书和配置文件位于 Apple 开发者网站中 钥匙串和 Xcode 包含证书 在黄金岁月里 有自动配置在视觉工作室中 苹果决定不再支持这一
  • 使用 EWS 和 OAuth 2 的 Office 365 日历 API

    请参阅底部的编辑 我正在尝试使用 EWS 不是托管 API 使用 Office 365 API 在用户日历上创建 删除 更新事件 到目前为止 我已成功使用基本身份验证来验证我的 SOAP 请求是否有效 我现在尝试用 OAuth 2 替换 B
  • 将根元素添加到 json 响应 (django-rest-framework)

    我正在尝试确定使用 django 和 django rest framework 将根元素添加到所有 json 响应的最佳方法 我认为添加自定义渲染器是实现我想要实现的目标的最佳方法 这就是我到目前为止所想到的 from rest fram