10

私はJSONField私のジャンゴアプリに持っています。データは次のようになります。

{
"05/2013" : 101,
"04/2013" : 100.9,
"03/2013" : 100.5,
"02/2013" : 100.3,
"01/2013" : 100.3
}

物価指数です。フィールドからデータを取得するときに、データが挿入された順序を保持したいと考えています。

を使用する高度なオプションを見ましたOrderedDict。Dict (私が推測する) は字句ソートを使用するため、出力はこの形式の元の順序を失います。2012-01日付を formatなどに反転しようと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})
...
4

2 に答える 2

1

これは興味深い質問です。特に、javascript オブジェクト、JSON 自体、または python dict のフィールドの順序について保証がないためです。

上記を考慮して、データベース + シリアライゼーション + デシリアライゼーション + プレゼンテーションの組み合わせで適切に順序を設定すると、この (非常に狭い) 構成でのみ機能します。

たとえば、django-jsonfield は (デフォルトで) JSON をテキスト フィールドにシリアル化するため、データベース レベルでは安全かもしれませんが、いくつかの json モジュール (json、simplejson、ujson、yajl) からの逆シリアル化はディクショナリに対して行われ、すべての順序が失われます。

django 1.9 では、ネイティブの postgresql JSONField が導入されています。ここでは、データが jsonb として内部的に保存されるため、データベース レベルでも保証されません。バイナリ最適化された JSON

私の意見では、シリアル化を検索する代わりに、OrderedDictデータの保存方法を変更することをお勧めします。順序が重要な場合は、データをテーブルに保存しましょう。

[{date: "05/2013", price: 101},
 {date: "04/2013", price: 100.9},
 {date: "03/2013", price: 100.5},
 {date: "02/2013", price: 100.3},
 {date: "01/2013", price: 100.3}]

順序の保証があり、データは線形問題で処理でき、特別な実装に依存していません。

于 2016-06-13T23:25:44.977 に答える