【发布时间】:2013-10-03 19:49:06
【问题描述】:
我的 django 应用程序中有一个 JSONField。数据可能如下所示:
{
"05/2013" : 101,
"04/2013" : 100.9,
"03/2013" : 100.5,
"02/2013" : 100.3,
"01/2013" : 100.3
}
这是一个价格指数。当我从字段中获取数据时,我想保留插入数据的顺序。
我查看了使用OrderedDict 的advanced option。 Dict(我猜)使用词法排序,因此输出会以这种格式丢失它的原始顺序。
我尝试将日期翻转为2012-01、2012-02 等格式,但输出仍然是乱码。部分输出:
"2011-08":104.2,
"2011-09":104,
"2011-02":102.3,
"2011-03":102.5,
"2011-01":102,
"2011-06":104,
"2011-07":103.7,
"2011-04":103.1,
"2011-05":103.6,
"2013-04":100.9,
"2013-05":101,
"2012-10":106,
"2012-11":105.5,
我不确定这是哪种类型,我在寻找解决方案方面落后了一步。 欣赏任何想法。
编辑: 这是模型字段声明
from jsonfield import JSONField
...
values = JSONField(null=True, blank=True, verbose_name=_("values"),load_kwargs={'object_pairs_hook': collections.OrderedDict})
...
【问题讨论】:
-
如果您想保留插入顺序,您可能希望通过首先对旧值进行排序来填充您的字段。类似
price = OrderedDict(sorted(price.items(), key=lambda t: t[0])) -
@Germano - 你能解释一下你的答案吗 - 我不确定这条线的去向...... pre_save?
-
我不知道您是否有旧数据库,或者您是从头开始,也不知道您是否打算一次插入多个项目。该信息将让您选择插入该代码的正确位置。
-
字典根据定义是无序的。不是词汇或任何东西,即使顺序在单个会话中是一致的,也没有预期的顺序。话虽如此,我认为高级示例应该可以工作,但从您的回复来看,我认为它没有。您可以使用
sorted(the_dict.items())轻松解决此问题,但这并不能解释为什么它不起作用。只要您的日期格式为yyyy-mm,词法排序就可以工作。 -
我是从零开始的,所以我很灵活。大多数情况下,我会批量插入数据,但我可能会更新。在这个例子中 - 我很明显每个月都会添加一行。 @Wolph - 我是新手,但根据我在 github 上的文档中的理解,这应该保留它插入的顺序,而不是按项目排序(你怎么能这样做? .... json 可能会得到相当复杂)。