gpt4 book ai didi

Django : json serialize a queryset which uses defer() or only()

转载 作者:行者123 更新时间:2023-12-02 08:26:15 28 4
gpt4 key购买 nike

现在我一直在使用 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

最佳答案

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

doc for json serialization说:

Be aware that if you're serializing using that module directly, not all Django output can be passed unmodified to simplejson. In particular, lazy translation objects need a special encoder written for them.

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

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

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

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

Returns a class object that is a copy of "model" with the specified "attrs" being replaced with DeferredAttribute objects. The "pk_value" ties the deferred attributes to a particular instance of the model.

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

我会尝试设置一个小测试,看看是否可以重现该问题。

关于 Django : json serialize a queryset which uses defer() or only(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2096616/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com