如何在不查询数据库的情况下找到sqlalchemy远程对象的类或类名?

9 投票
2 回答
6102 浏览
提问于 2025-04-16 22:21

我们有两个类,分别叫做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

撰写回答