我很难保留存储在 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)
有任何想法吗?