Как исключить определенные поля для сериализации с помощью jsonpickle?

Я использую расширение SQLAlchemy с Flask. При сериализации моих моделей (которые также используются для операций с базой данных), используя jsonpickle, я хочу, чтобы некоторые конкретные атрибуты игнорировались. Есть ли способ, который позволяет мне устанавливать эти правила?

SQLAlchemy добавляет к объекту атрибут с именем _sa_instance_state. Одним словом, я не хочу, чтобы это поле было на выходе JSON.

Ответ 1

Вы не можете сказать диспетчеру класса по умолчанию игнорировать что-то, нет.

jsonpickle поддерживает модуль pickle __getstate__ и __setstate__. Если ваши классы реализуют эти два метода, все, что возвращается, затем используется jsonpickle для представления состояния вместо этого. Оба метода необходимо выполнить.

Если __getstate__ не реализовано, jsonpickle вместо этого использует атрибут __dict__, поэтому ваша собственная версия просто должна использовать тот же словарь, удалить ключ _sa_instance_state, и вы закончите:

def __getstate__(self):
    state = self.__dict__.copy()
    del state['_sa_instance_state']
    return state

def __setstate__(self, state):
    self.__dict__.update(state)

Независимо от того, что возвращается __getstate__, будет обработано далее, рекурсивно, нет необходимости беспокоиться об обработке подобъектов там.

Если добавление __getstate__ и __setstate__ не является опцией, вы также можете зарегистрировать настраиваемый обработчик сериализации для своего класса; недостатком является то, что, хотя __getstate__ может уйти, просто вернув словарь, пользовательский обработчик должен будет вернуть полностью сплющенное значение.