Вам просто нужно добавить в свой вызов .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, см. документы .