Модели Django не являются сериализуемыми в ajax
-
12-09-2019 - |
Вопрос
У меня есть простое представление, которое я использую для экспериментов с 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')
Это возвращает следующее:
TypeError at /sched/shifts/2009/11/9/
<User: someguy> is not JSON serializable
Если я удаляю строку data['x'], чтобы не ссылаться ни на какие модели, она работает и возвращает это:
{"e": "11", "d": "2009"}
Почему simplejson не может проанализировать мою одну из моделей django по умолчанию?Я получаю одно и то же поведение с любой моделью, которую я использую.
Решение
Вам просто нужно добавить, в вашем .dumps
вызов, а default=encode_myway
аргумент, позволяющий simplejson
знайте, что делать, когда вы передаете ему данные, типы которых он не знает - ответ на ваш вопрос "почему", конечно, заключается в том, что вы этого не сделали рассказанный бедный simplejson
что делать с одним из экземпляров вашей модели.
И, конечно, вам нужно написать encode_myway
для предоставления данных, кодируемых в формате JSON, например:
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")
В принципе, JSON знает об ОЧЕНЬ элементарных типах данных (strings, ints и float, сгруппированных в dicts и списки) - это ваша ответственность как прикладного программиста за сопоставление всего остального с такими элементарными типами данных и в simplejson
обычно это делается с помощью функции, передаваемой default=
в dump
или dumps
время.
В качестве альтернативы, вы можете использовать json
сериализатор, который является частью Django, см. документы.