backref类属性

时间:2013-02-17 13:51:51

标签: python sqlalchemy

如何在没有通过会话的某些查询的情况下初始化映射器的backref? 例如,我有两个模型,在以下代码中命名为“Client”和“Subject”:

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'))

然后,在我的代码中的某个地方,我希望像这样得到类client的backref Subject,但这会引发异常:

>>> Subject.client
AttributeError: type object 'Subject' has no attribute 'client'

查询Client之后:

>>> session.query(Client).first()
>>> Subject.client
<sqlalchemy.orm.attributes.InstrumentedAttribute at 0x43ca1d0>

在查询相关模型(mapper)之后创建了属性client 我不想做这种“变暖”的询问!

2 个答案:

答案 0 :(得分:7)

或者,您可以使用:

from sqlalchemy.orm import configure_mappers

configure_mappers()

这样做的好处是可以一步为所有模型创建所有背景。

答案 1 :(得分:5)

由于SQLAlchemy使用元类,因此在您至少创建了Client类的一个实例之前,将无法运行在另一个类上创建后向引用的代码。

补救措施很简单:创建一个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>

或使用configure_mappers效用函数:

from sqlalchemy.orm import configure_mappers

扫描模型以获取此类参考并初始化它们。实际上,创建任何一个实例都会调用此方法。