Найти - Пользователи
Полная версия: SQLAlchemy class сериализовать в json
Начало » Web » SQLAlchemy class сериализовать в json
1 2
jon34
Пытаюсь сделать сериализацию модельного класса в 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
sander
jon34
откуда потребность в сериализации?
4kpt_IV
Вообще автосериализацию писать опасно. Можно нахвататься множество проблема.
Лучше явно собирать в специальном методе to_json…
FishHook
4kpt_IV
Можно нахвататься множество проблема.
Не плохо бы привести пример.
jon34
Да, тоже интересны примеры, но подозреваю речь идет о том, что могут быть сериализованы и отданы те данные, которые не должны ни куда уйти (пароли и т д)
FishHook
jon34
Да, тоже интересны примеры, но подозреваю речь идет о том, что могут быть сериализованы и отданы те данные, которые не должны ни куда уйти

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

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

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

Да блин!!!

Ну очевидно же, что 99% твоих моделей должны сериализоваться автоматически, и для 1% ты будешь вынужден писать кастомную реализацию сериализатора. Это базис вообще понятия “наследование”, это сверхочевидное решение DRY-принципа. Какие могут быть прения то вообще?
jon34
FishHook
Ок, хорошо, если так. Можете помочь тогда мне с проблемой описанной в 1 посте?
FishHook
jon34
FishHookОк, хорошо, если так. Можете помочь тогда мне с проблемой описанной в 1 посте?
А я не спец в SQLA и с вашей проблемой я не встречался. Код который в вашем первом посте скопирован со стековерфло, то есть вы сами (насколько я понимаю), глубоко в задачу не погружались. Могу даже предположить, что вы не понимаете, что он делает (буду рад если ошибся). Со своей стороны посоветую вам обратить свой взор на Django, там таких проблем нет. 4kpt_IV сейчас скажет, что я баран, а джанго - тупой фреймворк для баранов, но тут одно из двух, или он пусть вам сериализатор напишет или признает, что тупые решения могут быть самими надежными.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB