0

我遇到的问题是将使用 django.core.serializers 的序列化 Django 模型与其他一些数据混合,然后尝试使用 json.dumps 序列化整个事物。

示例代码:

scores  = []
for indicator in indicators:
    score_data = {}
    score_data["indicator"] = serializers.serialize("json", [indicator,])
    score_data["score"] = evaluation.indicator_percent_score(indicator.id)
    score_data["score_descriptor"] = \
        serializers.serialize("json", 
            [form.getDescriptorByPercent(score_data["score"]),], 
            fields=("order", "value", "title"))
    scores.append(score_data)
scores = json.dumps(scores)

return HttpResponse(scores)

它返回一个对象列表,如下所示:

{
    indicator: "{"pk": 345345, "model": "forms.indicator", "fields": {"order": 1, "description": "Blah description.", "elements": [10933, 4535], "title": "Blah Title"}}",
    score: 37.5,
    score_descriptor: "{"pk": 66666, "model": "forms.descriptor", "fields": {"order": 1, "value": "1.00", "title": "Unsatisfactory"}}"
}

我遇到的问题可以在 JSON 中看到,序列化的 Django 模型被包装在多组引号中。当我尝试做类似的事情时,这使得在客户端很难使用

indicator.fields.order

它评估为无,因为浏览器认为我正在处理某种字符串。

理想情况下,我希望有效的 JSON 没有使其不可读的冲突引用。类似于这样的对象列表:

{
    indicator: {
        pk: 12931231,
        fields: {
            order: 1,
            title: "Blah Title",
        }
    },
    etc.
 }

我应该使用不同的数据结构、不同的序列化程序以不同的顺序执行此操作吗?

4

1 回答 1

1

我的解决方案包括放弃使用django.core.serializersand 而使用django.forms.model_to_dictand django.core.serializers.json.DjangoJSONEncoder

生成的代码如下所示:

for indicator in indicators:
    score_data = {}
    score_data["indicator"] = model_to_dict(indicator)
    score_data["score"] = evaluation.indicator_percent_score(indicator.id)
    score_data["score_descriptor"] = \
        model_to_dict(form.getDescriptorByPercent(score_data["score"]), 
            fields=("order", "value", "title"))

    scores.append(score_data)
scores = json.dumps(scores, cls=DjangoJSONEncoder)

问题似乎源于我实际上是对 Django 模型进行了两次序列化这一事实。一次使用django.core.serializers函数,一次使用json.dumps函数。

该解决方案首先将模型转换为字典,将其与其他数据一起放入字典中,然后json.dumps使用DjangoJSONEncoder.

希望这对某人有所帮助,因为我找不到我的具体问题,但能够使用其他 stackoverflow 帖子的其他答案将其拼凑在一起。

于 2013-08-30T15:01:42.233 回答