Модели Django не сериализуются в ajax - PullRequest
10 голосов
/ 22 сентября 2009

У меня есть простое представление, которое я использую для экспериментов с 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? Я получаю такое же поведение с любой моделью, которую я использую.

1 Ответ

29 голосов
/ 22 сентября 2009

Вам просто нужно добавить в свой вызов .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 знает о ОЧЕНЬ элементарных типах данных (строки, целые числа и числа с плавающей запятой, сгруппированные в тексты и списки) - ВАША обязанность как программиста приложения сопоставлять все остальное с такими элементарными типами данных и из simplejson это обычно делается через функцию, переданную default= в dump или dumps времени.

В качестве альтернативы вы можете использовать сериализатор json, входящий в состав Django, см. документы .

...