2012-02-22 66 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

相关问题