Форум сайта python.su
Пытаюсь сделать сериализацию модельного класса в 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
Офлайн
jon34
откуда потребность в сериализации?
Офлайн
Вообще автосериализацию писать опасно. Можно нахвататься множество проблема.
Лучше явно собирать в специальном методе to_json…
Офлайн
4kpt_IVНе плохо бы привести пример.
Можно нахвататься множество проблема.
Офлайн
Да, тоже интересны примеры, но подозреваю речь идет о том, что могут быть сериализованы и отданы те данные, которые не должны ни куда уйти (пароли и т д)
Офлайн
jon34
Да, тоже интересны примеры, но подозреваю речь идет о том, что могут быть сериализованы и отданы те данные, которые не должны ни куда уйти
Офлайн
Ну, я просто решаю проблему того, как по api клиенту отдавать информацию и в этом контексте опасения о том, что автоматическая сериалиализация может нести опасность я могу понять.
Просто думал, что в каждом классе писать метод to_json не очень хорошая идея, потому что много ручной работы будет.
Офлайн
jon34
Ну, я просто решаю проблему того, как по api клиенту отдавать информацию и в этом контексте опасения о том, что автоматическая сериалиализация может нести опасность я могу понять.
Просто думал, что в каждом классе писать метод to_json не очень хорошая идея, потому что много ручной работы будет.
Офлайн
FishHook
Ок, хорошо, если так. Можете помочь тогда мне с проблемой описанной в 1 посте?
Офлайн
jon34А я не спец в SQLA и с вашей проблемой я не встречался. Код который в вашем первом посте скопирован со стековерфло, то есть вы сами (насколько я понимаю), глубоко в задачу не погружались. Могу даже предположить, что вы не понимаете, что он делает (буду рад если ошибся). Со своей стороны посоветую вам обратить свой взор на Django, там таких проблем нет. 4kpt_IV сейчас скажет, что я баран, а джанго - тупой фреймворк для баранов, но тут одно из двух, или он пусть вам сериализатор напишет или признает, что тупые решения могут быть самими надежными.
FishHookОк, хорошо, если так. Можете помочь тогда мне с проблемой описанной в 1 посте?
Офлайн