Модификация поля модели SQLAlchemy нарушает атрибуты отношения joinload - PullRequest
0 голосов
/ 20 февраля 2020

Я выполняю запрос и передаю несколько вызовов 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, если я изменяю запись, даже до запроса с объединениями?

...