Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 12, 2016 23:47:43

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy class сериализовать в json

Пытаюсь сделать сериализацию модельного класса в json. Нашёл подходящий для себя пример в сети, но возникла проблема с классами где в relationship установлен параметр lazy='dynamic'. При сериализации таких полей возникает ошибка
TypeError: <sqlalchemy.orm.dynamic.AppenderQuery object at 0x10e23ee48> is not JSON serializable

Код взят с http://stackoverflow.com/questions/5022066/how-to-serialize-sqlalchemy-result-to-json

 def new_alchemy_encoder(revisit_self = False, fields_to_expand = []):
    _visited_objs = []
    class AlchemyEncoder(json.JSONEncoder):
        def default(self, obj):
            if isinstance(obj.__class__, DeclarativeMeta):
                # don't re-visit self
                if revisit_self:
                    if obj in _visited_objs:
                        return None
                    _visited_objs.append(obj)
                # go through each field in this SQLalchemy class
                fields = {}
                for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata']:
                    val = obj.__getattribute__(field)
                    # is this field another SQLalchemy object, or a list of SQLalchemy objects?
                    if isinstance(val.__class__, DeclarativeMeta) or (isinstance(val, list) and len(val) > 0 and isinstance(val[0].__class__, DeclarativeMeta)):
                        # unless we're expanding this field, stop here
                        if field not in fields_to_expand:
                            # not expanding this field: set it to None and continue
                            fields[field] = None
                            continue
                    fields[field] = val
                # a json-encodable dict
                return fields
            return json.JSONEncoder.default(self, obj)
    return AlchemyEncoder

Офлайн

#2 Ноя. 13, 2016 13:53:31

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

SQLAlchemy class сериализовать в json

jon34
откуда потребность в сериализации?

Офлайн

#3 Ноя. 13, 2016 14:23:30

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

SQLAlchemy class сериализовать в json

Вообще автосериализацию писать опасно. Можно нахвататься множество проблема.
Лучше явно собирать в специальном методе to_json…

Офлайн

#4 Ноя. 13, 2016 15:04:59

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

SQLAlchemy class сериализовать в json

4kpt_IV
Можно нахвататься множество проблема.
Не плохо бы привести пример.



Офлайн

#5 Ноя. 13, 2016 15:17:46

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy class сериализовать в json

Да, тоже интересны примеры, но подозреваю речь идет о том, что могут быть сериализованы и отданы те данные, которые не должны ни куда уйти (пароли и т д)

Офлайн

#6 Ноя. 13, 2016 15:57:21

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

SQLAlchemy class сериализовать в json

jon34
Да, тоже интересны примеры, но подозреваю речь идет о том, что могут быть сериализованы и отданы те данные, которые не должны ни куда уйти

Сериализация есть во всех современных языках программирования, это необходимый элемент межпроцессного взаимодействия, сетевого взаимодействия, сохранения состояния, кеширования - в общем без сериализации нельзя написать хоть сколько-нибудь вменяемой программы. Разумеется, автоматическая сериализация присутствует везде и всюду, в питоне есть модуль стандартной библиотеки pickle, в java есть java.io.Serializable, в С# BinaryFormatter.serialize - это все есть автоматическая сериализация, на ней работает весь интернет, когда мне говорят “Вообще автосериализацию писать опасно” я не понимаю, что хотел сказать автор.



Офлайн

#7 Ноя. 13, 2016 16:11:15

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy class сериализовать в json

Ну, я просто решаю проблему того, как по api клиенту отдавать информацию и в этом контексте опасения о том, что автоматическая сериалиализация может нести опасность я могу понять.

Просто думал, что в каждом классе писать метод to_json не очень хорошая идея, потому что много ручной работы будет.

Офлайн

#8 Ноя. 13, 2016 16:18:16

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

SQLAlchemy class сериализовать в json

jon34
Ну, я просто решаю проблему того, как по api клиенту отдавать информацию и в этом контексте опасения о том, что автоматическая сериалиализация может нести опасность я могу понять.

Просто думал, что в каждом классе писать метод to_json не очень хорошая идея, потому что много ручной работы будет.

Да блин!!!

Ну очевидно же, что 99% твоих моделей должны сериализоваться автоматически, и для 1% ты будешь вынужден писать кастомную реализацию сериализатора. Это базис вообще понятия “наследование”, это сверхочевидное решение DRY-принципа. Какие могут быть прения то вообще?



Офлайн

#9 Ноя. 13, 2016 16:25:19

jon34
Зарегистрирован: 2016-02-14
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

SQLAlchemy class сериализовать в json

FishHook
Ок, хорошо, если так. Можете помочь тогда мне с проблемой описанной в 1 посте?

Офлайн

#10 Ноя. 13, 2016 16:43:26

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

SQLAlchemy class сериализовать в json

jon34
FishHookОк, хорошо, если так. Можете помочь тогда мне с проблемой описанной в 1 посте?
А я не спец в SQLA и с вашей проблемой я не встречался. Код который в вашем первом посте скопирован со стековерфло, то есть вы сами (насколько я понимаю), глубоко в задачу не погружались. Могу даже предположить, что вы не понимаете, что он делает (буду рад если ошибся). Со своей стороны посоветую вам обратить свой взор на Django, там таких проблем нет. 4kpt_IV сейчас скажет, что я баран, а джанго - тупой фреймворк для баранов, но тут одно из двух, или он пусть вам сериализатор напишет или признает, что тупые решения могут быть самими надежными.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version