【问题标题】:Using Django ORM to serialize data and related members使用 Django ORM 序列化数据和相关成员
【发布时间】: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 和外键。

你已经试过了吗?有吗?

【问题讨论】:

    标签: django rest serialization django-orm django-rest-framework


    【解决方案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 就可以找出使用什么
    猜你喜欢
    • 2016-03-22
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多