Вам нужно только скопировать свойства столбца, которые можно легко отфильтровать с помощью isinstance(prop, sqlalchemy.orm.ColumnProperty)
. Обратите внимание, что вы ДОЛЖНЫ копировать хранимые извне отношения (все многие ко многим), поскольку в основной таблице нет соответствующих им столбцов. Это не может быть сделано с высокоуровневым интерфейсом без отложенной загрузки, поэтому я предпочел бы принять этот компромисс. Соотношение «многие ко многим» можно определить с помощью теста isinstance(prop, RelationProperty) and prop.secondary
. Полученный код будет выглядеть следующим образом:
from sqlalchemy.orm import object_mapper, ColumnProperty, RelationProperty
newobj = type(src)()
for prop in object_mapper(src).iterate_properties:
if (isinstance(prop, ColumnProperty) or
isinstance(prop, RelationProperty) and prop.secondary):
setattr(newobj, prop.key, getattr(src, prop.key))
Также обратите внимание, что SQLAlchemy предназначен для поддержки одного объекта, загруженного для каждого удостоверения, в то время как ваша копия ломает это, когда копируются свойства удостоверения (первичного ключа), но это, вероятно, не тот случай, если вы сохраняете с новым (версионным) ) идентификатор.