使用 Django ORM 序列化数据和相关成员

Posted

技术标签:

【中文标题】使用 Django ORM 序列化数据和相关成员【英文标题】:Using Django ORM to serialize data and related members 【发布时间】:2012-02-03 17:44:05 【问题描述】:

我目前正在使用 django 开发 REST api。我开始使用漂亮的 djangorestframework,我喜欢使用“View”类。 但是,我面临着序列化问题。 我不喜欢使用 Serializer 类的序列化。 主要目标是准备一种包含所有信息的巨型字典,并将其提供给渲染器类,该类根据“Accept:”HTTP 标头将其转换为 xml、json、yaml。目标是经典的,但 60% 的 CPU 时间用于创建“GIANT DICT”。

这个 dict 可以使用 django 模型创建,但我认为使用动态实例化的类和对象是非常低效的?我正在尝试使用一些 QuerySet 方法来过滤我想要拥有的模型成员,并获得一个简单的 dict : ::values() 方法,但不幸的是,我无法从我的模型中访问 m2m 和外键。

你已经试过了吗?有吗?

【问题讨论】:

【参考方案1】:

您可以使用 QuerySet 的 iterator 方法:

... 对于返回大量对象的 QuerySet 需要访问一次,这可以带来更好的性能和 显着减少内存。

您的代码应如下所示:

for obj in SomeModel.objects.values_list('id', 'name').iterator():
    # do something

【讨论】:

听起来很有趣。我明天早上试试! 抱歉,问题在于 orm 会为每个结果即时实例化一个对象。这是我不想要的东西。顺便说一句,使用 SomeModel.objects.values().iterator() 可能非常有趣。但我不想要对象生成,我确实需要 SomeMODel 中的关系(ForeignKey,M2M):) 是的,iterator() 可以与values_list() 一起使用,抱歉没有有用的示例。我已经更新了答案 我会尝试看看它如何处理 M2M 关系 但我认为它没有衡量使用模型实例或元组的内容,因为如果您不通过引用传递它,垃圾收集器将在下一次迭代中删除。任何方式这只是猜测,只需 profiling 就可以找出使用什么

以上是关于使用 Django ORM 序列化数据和相关成员的主要内容,如果未能解决你的问题,请参考以下文章

django项目相关配置方法

Django框架 之 ORM中介模型

6月20日 Django中ORM介绍和字段字段参数相关操作

Django-orm数据库相关

与ORM django和sqlite3数据库相关的问题

Django之ORM