Невозможно связать один атрибут для нескольких объектов в PonyORM, за исключением случая, когда эти объекты наследуются от одного и того же базового объекта, тогда вы можете указать базовый объект в качестве типа атрибута и использовать любой из унаследованных объектов в качестве действительного типа.
Если вы используете существующую схему, которую вы не можете изменить, вы, вероятно, не сможете использовать наследование и должны указать необработанный атрибут id вместо отношения:
from pony import orm
db = orm.Database()
class POI(db.Entity):
_table_ = "table_name"
name = orm.PrimaryKey(str)
coordinate_id = orm.Optional(int, column="coordinateID")
class Cartesian(db2.Entity):
_table_ = "cartesian"
id = orm.PrimaryKey(int, column="coordinateID")
x = orm.Required(float)
y = orm.Required(float)
class Polar(db2.Entity):
_table_ = "polar"
id = orm.PrimaryKey(int, column="coordinateID")
r = orm.Required(float)
phi = orm.Required(float)
И тогда вы можете выполнять такие запросы:
left_join(poi for poi in POI
for c in Cartesian
for p in Polar
if poi.coordinate_id == c.id
and poi.coordinate_id = p.id
and <some additional conditions>)
Обратите внимание, что все объекты, используемые в одном запросе, должны быть из одной базы данных. Если объекты принадлежат двум разным базам данных, вы не можете использовать их в одном запросе. И нужно выдавать отдельные запросы:
with db_session:
poi = POI.get(id=some_id)
coord = Cartesian.get(id=poi.coordinate_id)
if coord is None:
coord = Polar.get(id=poi.coordinate_id)
<do something with poi and coord>
Но в случае, например, SQLite, вы можете присоединить одну базу данных к другой, чтобы они выглядели как одна база данных.