Python backref类属性

Python backref类属性,python,sqlalchemy,Python,Sqlalchemy,如何在不通过会话进行某些查询的情况下初始化映射器的反向引用? 例如,我有两个模型,在下面的代码中分别命名为“客户机”和“主题”: Base = declarative_base() class Client(Base): __tablename__ = "clients" id = Column(Integer, primary_key=True) created = Column(DateTime, default=datetime.datetime.now)

如何在不通过会话进行某些查询的情况下初始化映射器的反向引用? 例如,我有两个模型,在下面的代码中分别命名为“客户机”和“主题”:

Base = declarative_base()

class Client(Base):
    __tablename__ = "clients"

    id = Column(Integer, primary_key=True)
    created = Column(DateTime, default=datetime.datetime.now)
    name = Column(String)

    subjects = relationship("Subject",  cascade="all,delete",
        backref=backref("client"))


class Subject(Base):
    __tablename__ = "subjects"

    id = Column(Integer, primary_key=True)
    client_id = Column(Integer, ForeignKey(Client.id, ondelete='CASCADE'))
然后,在我的代码中的某个地方,我想像这样获取类
主题
的backref
客户机
,但这会引发一个异常:

>>> Subject.client
AttributeError: type object 'Subject' has no attribute 'client'
查询
客户机后,如:

>>> session.query(Client).first()
>>> Subject.client
<sqlalchemy.orm.attributes.InstrumentedAttribute at 0x43ca1d0>
会话.query(客户端).first() >>>客户
对相关模型(映射器)进行查询后,创建了属性
client


我不想提出这种“温暖”的疑问

因为SQLAlchemy使用元类,所以在另一个类上创建反向引用的代码将不会运行,直到您至少创建了一个
客户机
类的实例

补救方法很简单:创建一个
Client()
实例,然后再次放弃它:

>>> Subject.client
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Subject' has no attribute 'client'
>>> Client()
<__main__.Client object at 0x104bdc690>
>>> Subject.client
<sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x104be9e10>

扫描模型以查找此类引用并对其进行初始化。实际上,创建任何一个实例都会在后台调用此方法。

或者,您可以使用:

from sqlalchemy.orm import configure_mappers

configure_mappers()

这样做的好处是,它可以在一个步骤中为所有模型创建所有backref。

将backref声明为简单的
backref='client'
是否更有效?我有点困惑,这不能正常工作。我应该把configure_mappers函数调用放在哪里?@user1111652:定义模型后运行的任何地方。我把它放在定义所有模型的my model.py声明下面。不起作用一个小代码示例可以帮助我找出问题所在。@user1111652:“不起作用”没有告诉我任何事情。我的代码示例正是这样做的;把它放在模型下面。如果你有多个带有模型的模块,请确保它们都是先导入的。我很惊讶文档中没有更清楚地说明这一点。
from sqlalchemy.orm import configure_mappers

configure_mappers()