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

Pla*_*own 5 django serialization json

现在我一直在使用json序列化器,它工作得很好.

我不得不修改我开始使用only()&defer()过滤器的查询,就像这样 -

retObj = OBJModel.objects.defer("create_dt").filter(loged_in_dt__gte=dtStart)
Run Code Online (Sandbox Code Playgroud)

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

{"pk": 19047, "model": "OBJModel_deferred_create_dt", "fields": {}}
Run Code Online (Sandbox Code Playgroud)

如果我删除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)
Run Code Online (Sandbox Code Playgroud)

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

注意:我使用的是django 1.1

cet*_*eek 2

我对您期望序列化程序如何处理延迟字段感到困惑...我可能错过了一些东西...

json 序列化的文档说:

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

该文档正在谈论惰性翻译,但我认为任何惰性操作都适用。

我认为如果您没有编写某种特殊的编码器来负责获取(访问)延迟字段的正确值,那么您所看到的只是正确的输出。

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

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

返回一个类对象,该对象是“model”的副本,其中指定的“attrs”被替换为 DeferredAttribute 对象。“pk_value”将延迟属性与模型的特定实例联系起来。

这就是事情变得模糊的地方(对我来说!):实际上,酸洗是针对您实际的OBJModel. 当被询问时,该代理模型应该返回原始模型的非延迟字段。但就你的情况而言,似乎并非如此。

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