Manevant
@Manevant
Учу Python

Из-за чего ошибка при использовании simplejson .dumps ( )?

Привет.
Возникает ошибка при попытке кодировать QuerySet в JSON и последующей передачи через Ajax, подскажите, где я ошибся.

import simplejson
hotel_list = Hotel.objects.filter(id__range=(5, 15)) # Берем из бд срез 15 элементов
hotel_json = simplejson.dumps([hotel_item for hotel_item in hotel_list])

После этого возникает ошибка вида:

File "/usr/lib64/python2.7/site-packages/simplejson/encoder.py", line 192, in default
    raise TypeError(repr(o) + " is not JSON serializable")

TypeError: <Hotel: Globus> is not JSON serializable


1. Подскажите, как правильно кодировать QuerySet в JSON.
2. Где можно почитать FAQ или гайд по simplejson.
3. Данный пример метода .dumps был найден на просторах StackOverflow'а, расскажите поподробнее что это за синтаксис такой.

Заранее большое спасибо.
  • Вопрос задан
  • 3364 просмотра
Решения вопроса 1
un1t
@un1t
В json методом dumps преобразуются простые объекты dict, list, unicode/str, а вы пытаетесь сеарилизовать модель.

[hotel_item for hotel_item in hotel_list]
# можно проще
list(hotel_list)


Почитайте про сериализацию тут.
https://docs.djangoproject.com/en/dev/topics/seria...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
sheknitrtch
@sheknitrtch
Модуль simplejson умеет серриализовать/десерриализовать экземпляры произвольных классов. Для этого у функции dumps есть параметр default. Пример:

import simplejson

class SomeClass(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

def custom_serrializer(obj):
    if isinstance(obj, SomeClass):
        return {"x": obj.x, "y": obj.y}
    raise TypeError(repr(o) + " is not JSON serializable")

print simplejson.dumps({"key": SomeClass(1,2)}, default=custom_serrializer)

Подробности в документации.
Ответ написан
Комментировать
@MagNet
1.
from django.core import serializers
data = serializers.serialize("json", Hotel.objects.filter(id__range=(5, 15)))

2. https://docs.djangoproject.com/en/dev/topics/seria...
3. simplejson.readthedocs.org/en/latest/#simplejson.dumps
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы