使用 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 序列化数据和相关成员的主要内容,如果未能解决你的问题,请参考以下文章