Pregunta

Tengo una visión simple que estoy usando para experimentar con AJAX.

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 lo siguiente:

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

¿Por qué no puede mi simplejson analizar uno de los modelos de Django por defecto? Me sale el mismo comportamiento con cualquier modelo que uso.

¿Fue útil?

Solución

Sólo tiene que añadir, en su llamada .dumps, un argumento para dejar default=encode_myway simplejson sabe qué hacer cuando se le pasa datos cuyo tipo no sabe - la respuesta a su "por qué" es, por supuesto, que se no tener dijo pobres simplejson qué hacer con uno de los casos 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 un programador de aplicaciones para que coincida con todo lo demás en / de dichos tipos de datos elementales, y en simplejson que es típicamente hecho a través de una función pasó a default= en dump o dumps tiempo.

Como alternativa, puede utilizar el serializador json que es parte de Django, vea los documentos .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top