2009-09-22 14 views
10

Tengo una vista simple que estoy usando para experimentar con AJAX.Los modelos de Django no son ajax serializables

def get_shifts_for_day(request,year,month,day): 

    data= dict() 
    data['d'] =year 
    data['e'] = month 
    data['x'] = User.objects.all()[2] 

    return HttpResponse(simplejson.dumps(data), mimetype='application/javascript') 

Esto devuelve lo siguiente:

TypeError at /sched/shifts/2009/11/9/ 

<User: someguy> is not JSON serializable 

Si tomo los datos de [ 'x'] línea, de modo que no estoy haciendo referencia cualquier modelo funciona y devuelve este:

{"e": "11", "d": "2009"} 

¿Por qué no puede simplejson analizar mi uno de los modelos django predeterminados? Obtengo el mismo comportamiento con cualquier modelo que uso.

+0

pregunta ambigua, no es realmente una pregunta en el título de la pregunta – geejay

Respuesta

29

sólo tiene que añadir, en su llamada .dumps, un argumento para dejar default=encode_mywaysimplejson saben qué hacer cuando se le pasa datos cuyo tipo no sabe - la respuesta a su "por qué" es por supuesto que no ha informado poor simplejson qué hacer con una de las instancias de sus modelos.

Y, por supuesto, tiene que escribir encode_myway para proporcionar datos JSON-codificable, por ejemplo:

def encode_myway(obj): 
    if isinstance(obj, User): 
    return [obj.username, 
      obj.firstname, 
      obj.lastname, 
      obj.email] 
    # and/or whatever else 
    elif isinstance(obj, OtherModel): 
    return [] # whatever 
    elif ... 
    else: 
    raise TypeError(repr(obj) + " is not JSON serializable") 

Básicamente, JSON sabe tipos de datos acerca muy elemental (cadenas, enteros y flotadores, agrupados en dicts y listas) - es SU responsabilidad como programador de aplicaciones hacer coincidir todo lo demás en/desde dichos tipos de datos elementales, y en simplejson que normalmente se realiza a través de una función pasada al default= en dump o dumps vez.

Alternativamente, puede usar el serializador json que es parte de Django, consulte the docs.

+0

+1 para la referencia al serializador incorporado. –

+2

no puede django ser lo suficientemente inteligente como para saber qué propiedades realmente importan (por supuesto en función de qué propiedades ha definido el usuario en el modelo) para el usuario final y cortar este dolor en el a ## por defecto? –

Cuestiones relacionadas