簡體   English   中英

django:控制json序列化

[英]django: control json serialization

有沒有辦法控制django中的json序列化? 下面的簡單代碼將返回json中的序列化對象:

co = Collection.objects.all()
c = serializers.serialize('json',co)

json看起來與此類似:

[
    {
        "pk": 1,
        "model": "picviewer.collection",
        "fields": {
            "urlName": "architecture",
            "name": "\u0413\u043e\u0440\u043e\u0434 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430",
            "sortOrder": 0
        }
    },
    {
        "pk": 2,
        "model": "picviewer.collection",
        "fields": {
            "urlName": "nature",
            "name": "\u041f\u0440\u0438\u0440\u043e\u0434\u0430",
            "sortOrder": 1
        }
    },
    {
        "pk": 3,
        "model": "picviewer.collection",
        "fields": {
            "urlName": "objects",
            "name": "\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043d\u0430\u0442\u044e\u0440\u043c\u043e\u0440\u0442",
            "sortOrder": 2
        }
    }
]

您可以看到它以一種能夠重新創建整個模型的方式對其進行序列化,您是否希望在某些時候執行此操作 - 公平,但在我的情況下對於簡單的JS ajax不是很方便:我想帶來交通最小化,使整個事情變得更加清晰。

我做的是創建了一個視圖,將對象傳遞給.json模板,模板將執行類似這樣的操作以生成“更好”的json輸出:

[
{% if collections %}
    {% for c in collections %}
{"id": {{c.id}},"sortOrder": {{c.sortOrder}},"name": "{{c.name}}","urlName": "{{c.urlName}}"}{% if not forloop.last %},{% endif %}
    {% endfor %}
{% endif %}
]

這確實有效,輸出更好(?)更好:

[
    {
        "id": 1,
        "sortOrder": 0,
        "name": "Город и архитектура",
        "urlName": "architecture"
    },
    {
        "id": 2,
        "sortOrder": 1,
        "name": "Природа",
        "urlName": "nature"
    },
    {
        "id": 3,
        "sortOrder": 2,
        "name": "Объекты и натюрморт",
        "urlName": "objects"
    } 
]

但是,我對我的解決方案使用模板的快速(處理中的額外步驟和可能的性能影響)感到困擾,並且需要手動工作來維護,例如,我應該更新模型。

我認為json生成應該是模型的一部分(如果我錯了,請糾正我)並使用本機python-json和django實現,但無法弄清楚如何使它剝離我不想要的位。

還有一件事 - 即使我將它限制為一組要序列化的字段,它也會使id始終位於元素容器之外,而是將其作為“pk”存在於其外部。

我建議你使用json庫來編碼你的數據,而不是自己構建類似json的字符串。 一方面,上面的代碼似乎沒有正確處理轉義。 編寫自己的序列化程序(bug除外)並沒有多大好處。

這真的很容易。 快速舉例:

from django.http import HttpResponse
from django.utils import simplejson

def simple_view(request):
    response = {'string': "test",
                'number': 42,
                'array': [1, 2, 3],
                'js_object': dict(foo="bar")}
    return HttpResponse(simplejson.dumps(response),
                        mimetype="application/json")

該視圖將返回以下JSON的等效內容:

{"string": "test",
 "number": 42,
 "array": [1, 2, 3],
 "js_object": {foo: "bar"}}

編輯:是的,Assaf Lavie是對的,你的模板可以噴出無效的JSON。

def view( request):
    m_all = list(model.objects.all().values())

    return HttpResponse(simplejson.dumps(m_all))

這應該可以解決問題。 使用值()並轉換為列表應該產生您想要的結果。

Piston將Django模型序列化為JSON,而不是自己編寫任何東西。 默認情況下,它只是序列化模型的字段,沒有元數據。 您可以輕松列出要包含或排除的字段(甚至是相關字段)。 沒有額外的模板,也沒有很少的視圖代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM