modelos do Django não são ajax serializável
-
12-09-2019 - |
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.
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 .