2012-02-22 70 views
5

因此,我正在使用Django編寫後端Web服務以創建&消耗JSON,而我的同事正在開發ExtJS4前端。我正在使用wadofstuff序列化器,以便序列化嵌套對象。讓Django在沒有「字段」字段的情況下序列化對象

我的同事在解析json時遇到問題,特別是Django將對象的字段放在「fields」字段中。一個簡單的例子:

事情現在正在連載的方式:

{ 
    "pk":1, 
    "model":"events.phone", 
    "fields":{ 
    "person":1, 
    "name":"Cell", 
    "number":"444-555-6666" 
    } 
} 

我想它們序列化,使ExtJS的,我的同胞開發商感到快樂的方法:

{ 
    "pk":1, 
    "model":"events.phone", 
    "person":1, 
    "name":"Cell", 
    "number":"444-555-6666" 
} 

我們需要然後串行一些比這更復雜的對象。

有沒有辦法用手寫我的序列化,以使Django或wadofstuff序列化程序不使用字段字段?

+0

有改變這種方式,但我很想知道爲什麼你的同事正在對它進行反序列化 - 這只是一個層面。 – 2012-02-22 21:35:47

+0

問題是,當我們有一個更復雜的對象,其中有四個不同的模型序列化在其中,其中兩個有另一個模型序列化在其中。 – jawilmont 2012-02-22 21:58:31

回答

16

自定義序列化的最佳方式是讓Django首先序列化爲Python字典。然後,你可以後期處理那些類型的字典,只要你喜歡,傾倒出來,以JSON前:

# this gives you a list of dicts 
raw_data = serializers.serialize('python', Phone.objects.all()) 
# now extract the inner `fields` dicts 
actual_data = [d['fields'] for d in raw_data] 
# and now dump to JSON 
output = json.dumps(actual_data) 
25

此外,還有修改Django的通用模型JSON輸出的更靈活的方式。看看在django.core.serializers模塊的源代碼(這是很簡單 - 我是一個新手蟒),並覆蓋get_dump_object方法:

from django.core.serializers.json import Serializer as Builtin_Serializer 

class Serializer(Builtin_Serializer): 
    def get_dump_object(self, obj): 
     return self._current 

在上面的例子中我擺脫這兩個pkmodel鍵和我回立即領域。

原始代碼是:

def get_dump_object(self, obj): 
    return { 
     "pk": smart_text(obj._get_pk_val(), strings_only=True), 
     "model": smart_text(obj._meta), 
     "fields": self._current 
    } 

原來的問題解決方案可能是,例如:

def get_dump_object(self, obj): 
    metadata = { 
     "pk": smart_text(obj._get_pk_val(), strings_only=True), 
     "model": smart_text(obj._meta), 
    } 
    return dict(metadata.items() + self._current.items()) 
+4

你先生,是個紳士和學者。 – 2015-02-27 01:03:58

相關問題