3

我很难保留存储在 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)

有任何想法吗?

4

0 回答 0