如何在不查询数据库的情况下找到sqlalchemy远程对象的类或类名?
我们有两个类,分别叫做X和Y,它们之间有关系,叫做x2y和y2x。通过class_mapper(Class).iterate_properties这个方法,我们可以获取到一个类的所有属性。所以x2y和y2x是关系属性,我希望能得到关系另一边的对象的类或者类名。
我已经尝试过解决这个问题。我找到了一种方法,使用了x2y.remote_side[0].table.name
,并创建了一个tables_map,它把表名映射到类,这在一对多和一对一的情况下都能很好地工作。但是如果我用它来处理多对多的关系,表名就变成了一个关联表。
有没有什么建议可以让我获取到关系另一边的类呢?
2 个回答
3
我发现,关系属性上的一个方法 argument() 返回的是远程类。
for prop in class_mapper(X).iterate_properties:
if isinstance(prop, RelationshipProperty):
relation = prop
relation.argument()
30
X.x2y.property.mapper.class_
relationshipproperty最终会像mapper现在那样,获得类级别的属性文档。
补充一下。这是一个测试,展示了上面的内容,从“X”返回“Y”,而且反射并不会创建关系,所以应该没有影响:
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class X(Base):
__tablename__ = 'x'
id = Column(Integer, primary_key=True)
x2y = relationship("Y")
class Y(Base):
__tablename__ = 'y'
id = Column(Integer, primary_key=True)
x_id = Column(Integer, ForeignKey("x.id"))
assert X.x2y.property.mapper.class_ is Y