Я выполняю запрос и передаю несколько вызовов joinedload
на options
, чтобы попытаться загрузить некоторые отношения, как показано ниже:
my_object = MyModel.query.options([
joinedload(MyModel.rel1), joinedload(MyModel.rel2).joinedload(...)]
).get(ID)
# Works as expected, meaning "rel1" and "rel2" attributes are included in resulting JSON:
json.dumps({"data": my_object}, cls=MyCustomEncoder)
Затем я передаю результат на simplejson.json.dumps()
(с пользовательский кодировщик, который вызывает to_dict()
на любых моделях SQLAlchemy). Это работает, как и ожидалось (отношения «rel1» и «rel2» были «видны» во время вызова json.dumps()
, а соответствующие данные включены в результирующий JSON) , если я не изменю объект и не зафиксирую изменения еще до окончательного запроса . Вот пример того, что я имею в виду:
my_object = MyModel.query.options([
joinedload(MyModel.rel1), joinedload(MyModel.rel2).joinedload(...)]
).get(ID)
my_object.some_column = some_value
DBSession.commit()
# Does not work as expected; "rel1" and "rel2" relationship attributes not present in resulting JSON:
json.dumps({"data": my_object}, cls=MyCustomEncoder)
Проблема сохраняется, даже когда я фиксирую изменения до запроса с joinedload
s:
my_object = MyModel.query.get(ID)
my_object.some_column = some_value
DBSession.commit()
my_object = MyModel.query.options([
joinedload(MyModel.rel1), joinedload(MyModel.rel2).joinedload(...)]
).get(ID)
# Does not work as expected; "rel1" and "rel2" relationship attributes not present in resulting JSON:
json.dumps({"data": my_object}, cls=MyCustomEncoder)
Есть ли у кого-нибудь понимание в то, что здесь происходит и почему атрибуты отношения не видны кодировщиком JSON, если я изменяю запись, даже до запроса с объединениями?