django:控制json序列化

2023-12-12

有没有办法在django中控制json序列化?下面的简单代码将返回 json 中的序列化对象:

co = Collection.objects.all()
c = serializers.serialize('json',co)

json 将类似于以下内容:

[
    {
        "pk": 1,
        "model": "picviewer.collection",
        "fields": {
            "urlName": "architecture",
            "name": "\u0413\u043e\u0440\u043e\u0434 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430",
            "sortOrder": 0
        }
    },
    {
        "pk": 2,
        "model": "picviewer.collection",
        "fields": {
            "urlName": "nature",
            "name": "\u041f\u0440\u0438\u0440\u043e\u0434\u0430",
            "sortOrder": 1
        }
    },
    {
        "pk": 3,
        "model": "picviewer.collection",
        "fields": {
            "urlName": "objects",
            "name": "\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043d\u0430\u0442\u044e\u0440\u043c\u043e\u0440\u0442",
            "sortOrder": 2
        }
    }
]

您可以看到它以一种能够重新创建整个模型的方式对其进行序列化,您是否希望在某个时候执行此操作 - 足够公平,但在我的情况下对于简单的 JS ajax 来说不太方便:我想带流量降到最低,让整个事情变得更加清晰。

我所做的是创建一个视图,将对象传递给 .json 模板,模板将执行类似的操作来生成“更好的”json 输出:

[
{% if collections %}
    {% for c in collections %}
{"id": {{c.id}},"sortOrder": {{c.sortOrder}},"name": "{{c.name}}","urlName": "{{c.urlName}}"}{% if not forloop.last %},{% endif %}
    {% endfor %}
{% endif %}
]

这确实有效,并且输出要好得多(?):

[
    {
        "id": 1,
        "sortOrder": 0,
        "name": "Город и архитектура",
        "urlName": "architecture"
    },
    {
        "id": 2,
        "sortOrder": 1,
        "name": "Природа",
        "urlName": "nature"
    },
    {
        "id": 3,
        "sortOrder": 2,
        "name": "Объекты и натюрморт",
        "urlName": "objects"
    } 
]

然而,我对我的解决方案使用模板的速度感到困扰(处理中的额外步骤和可能的性能影响),并且例如,如果我更新模型,则需要手动维护。

我认为 json 生成应该是模型的一部分(如果我错了,请纠正我)并使用本机 python-json 和 django 实现完成,但不知道如何让它去掉我不想要的部分。

还有一件事 - 即使当我将其限制为一组要序列化的字段时,它也会将 id 始终保留在元素容器之外,并将其呈现为“pk”。


这真的很容易。快速示例:

from django.http import HttpResponse
from django.utils import simplejson

def simple_view(request):
    response = {'string': "test",
                'number': 42,
                'array': [1, 2, 3],
                'js_object': dict(foo="bar")}
    return HttpResponse(simplejson.dumps(response),
                        mimetype="application/json")

此视图将返回与以下 JSON 等效的内容:

{"string": "test",
 "number": 42,
 "array": [1, 2, 3],
 "js_object": {foo: "bar"}}

编辑:是的,Assaf Lavie 是对的,你的模板可能会输出无效的 JSON。

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

django:控制json序列化 的相关文章

随机推荐

  • Java - 正则表达式在代码中查找注释

    一点fun这次用Java 我想编写一个从标准输入读取代码的程序 例如 逐行 例如 some comment class Main blah foo foo foo foo2 foo2 找到其中的所有评论并将其删除 我正在尝试使用正则表达式
  • 如何使用 Perl 列出具有特定名称模式的目录下的文件?

    我有一个目录 var spool在其中 名为的目录 a b c d e f g h i j k l m n o p q r s t u v x y z 在每个 字母目录 内 有一个名为 user 在这个里面 许多目录称为auser1 aus
  • String.split(".") 没有分割我的长字符串

    我正在执行以下操作 String test this is a example String test2 test split 问题 test2没有物品 但也有很多 in the test String 知道问题是什么吗 注意公共字符串 s
  • MvvmCross 无法在 iPhone 上为 EditingDidBegin 创建目标绑定

    我有一个绑定到 EditingDidBegin 的应用程序 它在 iPhone 模拟器 iOS 7 上运行良好 但在实际 iPhone 上运行时 我收到以下警告消息 MvxBind 警告 1 29 无法为 EditingDidBegin 创
  • 如何将一个 Jupyter 笔记本导入到另一个笔记本中

    显然有可能import将一个 Jupyter 笔记本插入另一个 链接页面有相当多的代码来完成此操作 我应该将该代码添加到导入笔记本中吗 页面对此并不清楚 它应该是一个通用的解决方案 因此将所有代码添加到导入其他笔记本的所有笔记本中是没有意义
  • 为什么我的列表项项目符号与浮动元素重叠

    我有一个 XHTML Strict 页面 我在其中将图像浮动在常规文本段落旁边 一切都很顺利 除非使用列表而不是段落 列表的项目符号与浮动图像重叠 更改列表或列表项的边距没有帮助 边距是从页面左侧开始计算的 但浮动会将列表项推到右侧insi
  • 微软认知服务情感 API。错误:“图像尺寸太小或太大。”

    我注意到认知服务套件中的情感 API 存在一个相当奇怪的错误 只要我发送 URL 一切都会正常工作 发送图像附件时 我收到此 JSON 错误 error code InvalidImageSize message Image size is
  • Sql 查询查找一系列相隔 5 分钟内发生的日期?

    这是 Sql Server 2008 我有一组数据 如下所示 Table UserAchievement id userId achievementId completedDate 当用户获得奖励时 奖励和用户以及日期都会被记录下来 我想要
  • Visual Studio 编译源文件的顺序是什么?

    我在 Visual Studio 2012 中有一个 C 库项目 包含这些文件 A h A cpp defines function Do A B h B cpp defines function Do B C h C cpp define
  • 如何在 CMake 文件中添加链接器或编译标志?

    我正在使用arm linux androideabi g 编译器 当我尝试编译一个简单的 Hello World 时程序编译得很好 当我通过在该代码中添加一个简单的异常处理来测试它时 它也可以工作 添加后 fexceptions 我猜它默认
  • 如何在 onSnapshot 之外从 firestore DB 获取数据

    当我尝试从 firestore 获取值并将其放入变量时 结果未定义 但在控制台中有效 My code this db collection Users doc uid get then docSnapshot gt if docSnapsh
  • bootstrap:从 show.bs.modal 事件中抑制模态

    是否可以告诉 bootstrapNOT显示模式 通过返回false从内部到框架show bs modal event EDIT 使用 stopPropagation 或简单地disable按钮不是我想要的 我想处理逻辑inside show
  • 在插入查询中动态选择列名

    收到错误列名 ColumnNames 无效 在最后一行 插入子句 知道为什么吗 Declare ColumnNames varchar 2000 Declare OrderId int set OrderId 110077 select C
  • Android studio logcat 窗口日志级别过滤器丢失

    我的打印屏幕 我不知道如何解决它 即使我尝试过解决这些问题 类似问题1 类似问题2我的android studio版本是2021 3 1 这就是New Logcat 更新 海豚 如果你想放置级别过滤器那么你只需要写level error l
  • 以编程方式设置 Android IP、DNS、GATEWAY 设置

    如何从 android java 设置 wifi ip 地址 dns 地址 网关 即以编程方式设置 我没有找到任何能够存储这些值的方法 您可以通过编程方式更改系统设置 首先 您需要在 AndroidManifest xml 中请求 WRIT
  • 捕获 iframe 的屏幕截图 - html2canvas 不起作用

    我有以下 iframe 我只是想捕获 iframe 内容的屏幕截图 我已经尝试过 html2canvas 但它似乎不起作用 我尝试过将 iframe 放入 div 中 但没有任何乐趣 我见过使用 php 实现此目的的各种方法 但似乎没有什么
  • 用多字符字符串替换字符

    我正在尝试替换德语和荷兰语变音符号 例如 or 它们应该写成ae代替 所以我不能简单地将一个字符翻译成另一个字符 有没有更优雅的方法来做到这一点 实际上它看起来像这样 尚未完成 SELECT addr REPLACE REPLACE add
  • Android:如何获取文件的创建日期?

    这是我的代码 File TempFiles new File Tempfilepath if TempFiles exists String child TempFiles list for int i 0 i lt child lengt
  • git分支可以用数字列出吗?

    我想知道是否有人构建了一个脚本或有办法列出带有数字的 git 分支 以便代替这个 最好在 bash 中 feature myusername ID 1111 my branch name feature myusername ID 2222
  • django:控制json序列化

    有没有办法在django中控制json序列化 下面的简单代码将返回 json 中的序列化对象 co Collection objects all c serializers serialize json co json 将类似于以下内容 p