2012-02-22 11 views
5

Pracuję więc nad napisaniem usługi wewnętrznej backendu przy użyciu Django, aby utworzyć & pochłonąć JSON, a mój kolega pracuje nad interfejsem ExtJS4. Używam serializera watofstuff, dzięki czemu mogę serializować zagnieżdżone obiekty.Pierwsze Django do serializacji obiektów bez pola "pola"

Mój kolega ma problem z analizą jsona, szczególnie że Django umieszcza pola dla obiektu w polu "pola". Krótki przykład:

jakimi rzeczy są szeregowane teraz:

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

Sposób Chciałbym szeregować je zrobić ExtJS i mój kolega deweloper szczęśliwa:

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

Będziemy potrzebować do szeregowania niektórych obiektów, które są jednak o wiele bardziej skomplikowane.

Czy istnieje sposób, aby ręcznie pisać moje serializacje, aby serializator Django lub wadofstuff nie korzystał z pola pól?

+0

Istnieją sposoby zmieniania tego, ale chciałbym się dowiedzieć, dlaczego kolega ma takie problemy z deserializacją - jest tylko o jeden poziom niżej. –

+0

Problem polega na tym, że mamy bardziej złożony obiekt, który ma cztery różne modele serializowane w nim, z których dwa mają inny model serializowany w nim. – jawilmont

Odpowiedz

16

Najlepszym sposobem na spersonalizowanie swojej serializacji jest przekonwertowanie Django do serializacji na dyktanda Pythona. Następnie można postprocesowego te dicts jednak chcesz, zanim je dumping się 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

Dodatkowo istnieje bardziej elastyczny sposób modyfikowania ogólnego modelu wyjście JSON w Django. Spójrz na kod źródłowy modułu django.core.serializers (co jest dość prosta - jestem nowicjuszem python) i zastąpić metodę 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 

W powyższym przykładzie mogę pozbyć się obu pk i model klucze i wrócę pola natychmiast.

Oryginalny kod jest:

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 
    } 

Rozwiązanie oryginalne pytanie może być, na przykład:

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

Jesteś panem, jesteś dżentelmenem i uczonym. –

Powiązane problemy