Pergunta

Eu tenho uma visão simples que eu estou usando a experiência com 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')

Isso retorna o seguinte:

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

<User: someguy> is not JSON serializable

Se eu tirar os dados linha [ 'x'] para que eu não estou fazendo referência quaisquer modelos funciona e retorna este:

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

Por que não pode simplejson parse meu único do padrão Django modelos? Eu obter o mesmo comportamento com qualquer uso modelo I.

Foi útil?

Solução

Você só precisa adicionar, na sua chamada .dumps, um argumento default=encode_myway deixar simplejson sabe o que fazer quando você passá-lo dados cujos tipos não sabe - a resposta para o seu "porquê" questão é claro que você não disse pobre simplejson o que fazer com um dos exemplos de seus modelos.

E, claro, você precisa escrever encode_myway para fornecer dados JSON-encodable, por exemplo:.

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")

Basicamente, JSON conhece muito elementar tipos de dados (strings, ints e carros alegóricos, agrupados em dicts e listas) - é sua responsabilidade como um programador da aplicação para combinar tudo em / de tais tipos de dados elementares, e em simplejson desse tipicamente feito através de uma função passada para default= em dump ou dumps tempo.

Como alternativa, você pode usar o serializador json que faz parte do Django, veja os docs .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top