现在我一直在使用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
答案 0 :(得分:2)
我很担心你会如何期望序列化程序在延迟字段方面的行为......我可能会遗漏一些东西...
请注意,如果您直接使用该模块进行序列化,并非所有Django输出都可以未经修改地传递给simplejson。特别是,延迟转换对象需要为它们编写特殊的编码器。
该文档讨论的是懒惰的翻译,但我认为任何懒惰的操作都适用。
我认为你所看到的只是正确的输出,如果你没有编写某种特殊的编码器来处理(访问)延迟字段的正确值。
评论后编辑:啊,我错过了没有其他字段被编码的事实。其他领域有哪些类型?我们能看到你的模特吗?默认编码器对FK和M2M字段的处理方式不同 - 但我在django.core.serializers.python.Serializer
或django.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))