django - 如何在 Django JSONField 中保留键顺序
问题描述
我很难保留存储在 Django JSONField 中的 JSON 对象中键的顺序。我已经尝试按照文档使用自定义编码器和解码器,但是 JSON 对象不断重新排序:
>>>from models import MyModel
>>>my_dict = {"c": 3, "b": 2, "a": 1}
>>>my_model = MyModel()
>>>my_model.my_field = my_dict
>>>my_model.save()
>>>my_model.refresh_from_db()
>>>my_model.my_field
OrderedDict([('a',1), ('b', 2), ('c', 3)])
我原以为它会回来OrderedDict([('c',3), ('b', 2), ('a', 1)])
。
这是我迄今为止尝试过的:
模型.py:
import collections
import json
from django.db import models
class OrderedEncoder(json.JSONEncoder):
def encode(self, o):
if isinstance(o, collections.OrderedDict):
encoded_objs = [
f"{self.encode(k)}: {self.encode(v)}"
for k, v in o.items()
]
return f"{{{','.join(encoded_objs)}}}"
else:
return super().encode(o)
class OrderedDecoder(json.JSONDecoder):
def __init__(self, *args, **kwargs):
default_kwargs = {
"object_pairs_hook": collections.OrderedDict
}
default_kwargs.update(kwargs)
super().__init__(*args, **default_kwargs)
class MyModel(models.Model):
my_field = models.JSONField(encoder=OrderedEncoder, decoder=OrderedDecoder)
有任何想法吗?
解决方案
推荐阅读
- sql - 如何进行 Sql 查询,该查询将采用具有 AND OR () 等关键字的搜索词及其组合
- sorting - 如何在 Spark DataFrame 上应用部分排序?
- c++ - 如何检查调用者是否仍然存在于任务回调中
- html - DIV 边界不对齐
- html - 如何删除底部伪元素前后的空格?
- r - r Kohonen map - 如何找到一个数据集的位置?
- javascript - Three.js - 画布元素未正确显示。只看到黑匣子
- java - 为什么验证 Spring 控制器请求参数需要 @Validated?
- hibernate - Hibernate 双向 OneToOne 连接获取产生 n+1 个查询
- mysql - 无法在 Windows 上连接到 MySQL 8.0.21 的 localhost:3306 (2003)