2012-02-22 23 views
5

Así que estoy trabajando en la escritura del servicio web back-end utilizando Django para crear & consumo JSON, y mi colega está trabajando en la interfaz ExtJS4. Estoy usando el serializador wadofstuff para poder serializar objetos anidados.Hacer que Django serialice objetos sin el campo "campos"

Mi colega tiene problemas para analizar el json, específicamente que Django coloca los campos para un objeto dentro de un campo "campos". Un breve ejemplo:

La forma de las cosas por entregas ahora:

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

La forma me gustaría serializarlos para hacer ExtJS y mi compañero desarrollador feliz:

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

Necesitaremos serializar algunos objetos que son mucho más complicados que esto sin embargo.

¿Hay alguna forma de escribir mis serializaciones a mano para hacer que el serializador Django o wadofstuff no use un campo de campos?

+0

Hay maneras de cambiar esto, pero me interesaría saber por qué su colega está teniendo tales problemas deserializándolo, es solo un nivel inferior. –

+0

El problema es cuando tenemos un objeto más complejo que tiene cuatro modelos diferentes serializados dentro de él, dos de los cuales tienen otro modelo serializado dentro de él. – jawilmont

Respuesta

16

La mejor manera de personalizar su serialización es hacer que Django serialice primero a los dictados de Python. A continuación, puede post-procesar esos predice como usted quiera, antes de volcar hacia fuera a 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

Además, hay una manera más flexible de modificar el modelo general de salida JSON en Django. Echar un vistazo al código fuente django.core.serializers módulo (que es bastante simple - Soy un novato pitón) y anular el método 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 

En el ejemplo anterior me deshago de las dos teclas y pkmodel y regreso los campos inmediatamente

El código original es:

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 
    } 

La solución a la pregunta inicial podría ser, por ejemplo:

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

Usted señor, es un caballero y un erudito. –

Cuestiones relacionadas