Django:json序列化一个使用defer()或only()的查询集

时间:2010-01-19 19:57:00

标签: django json serialization

现在我一直在使用json序列化程序,效果很好。

我开始使用only()& defer()过滤器,就像这样 -

retObj = OBJModel.objects.defer("create_dt").filter(loged_in_dt__gte=dtStart)

完成上述操作后,突然json序列化程序返回空字段 -

{"pk": 19047, "model": "OBJModel_deferred_create_dt", "fields": {}}

如果删除defer(),序列化程序会正确提供所有数据。

import json
from django.utils import simplejson
from django.core import serializers
json_serializer = serializers.get_serializer("json")()
retObj = OBJModel.objects.defer("create_dt").filter(loged_in_dt__gte=dtStart)
json_serializer.serialize(retObj, ensure_ascii=False)

我已经暂时搁浅了一会儿。任何见解都会很棒。

注意:我使用的是django 1.1

2 个答案:

答案 0 :(得分:2)

我很担心你会如何期望序列化程序在延迟字段方面的行为......我可能会遗漏一些东西...

doc for json serialization说:

  

请注意,如果您直接使用该模块进行序列化,并非所有Django输出都可以未经修改地传递给simplejson。特别是,延迟转换对象需要为它们编写特殊的编码器。

该文档讨论的是懒惰的翻译,但我认为任何懒惰的操作都适用。

我认为你所看到的只是正确的输出,如果你没有编写某种特殊的编码器来处理(访问)延迟字段的正确值。

评论后编辑:啊,我错过了没有其他字段被编码的事实。其他领域有哪些类型?我们能看到你的模特吗?默认编码器对FK和M2M字段的处理方式不同 - 但我在django.core.serializers.python.Serializerdjango.core.serializers.json.Serializer上看不到任何可以解释为什么其他非延迟字段不编码...

经过进一步调查后编辑:上面json有效负载中的OBJModel_deferred_create_dt让我进一步深入挖掘。这似乎是在django基础Model类中从django.db.models.queryutils.deferred_class_factory()方法调用__reduce__的结果。 deferred_class_factory()

  

返回一个类对象,它是“model”的副本,指定的“attrs”被DeferredAttribute对象替换。 “pk_value”将延迟属性绑定到模型的特定实例。

这就是事情变得模糊(对我来说!):实际上,对于你的实际OBJModel,正在对proxy model进行腌制。当被问到时,该代理模型应该返回原始模型的非延迟字段。但在你的情况下,它似乎不是。

我会尝试设置一个小测试,看看我是否可以复制问题。

答案 1 :(得分:0)

我认为这是某种错误。以下是解决方法。在调用序列化之前执行此操作。您将受到性能影响,但可能不会序列化整个对象。

for obj in qs:
    for attr in qs.query.deferred_loading[0]:
        obj._meta.local_fields.append(qs.model._meta.get_field(attr))