Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top