2013-02-17 39 views
5

Làm cách nào để khởi tạo backrefs của những người lập bản đồ mà không có một số truy vấn thông qua một phiên? Ví dụ, tôi có hai mô hình, có tên là "khách hàng" và "Subject" trong mã sau:thuộc tính lớp backref

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

Sau đó, ở đâu đó trong mã của tôi, tôi muốn nhận được backref client của lớp Subject như thế này, nhưng mà đặt ra một ngoại lệ:

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

Sau một truy vấn để Client như:

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

Thuộc tính client được tạo sau khi truy vấn đến mô hình liên quan (trình ánh xạ).
Tôi không muốn tạo các truy vấn "nóng lên" như vậy!

+0

Không tuyên bố backref chỉ đơn giản là 'backref = 'client'' làm việc tốt hơn? Tôi hơi bối rối vì điều này không hoạt động bình thường. –

Trả lời

6

Ngoài ra, bạn có thể sử dụng:

from sqlalchemy.orm import configure_mappers 

configure_mappers() 

này có ưu điểm là nó tạo ra tất cả các backrefs cho tất cả các mô hình của bạn trong một bước.

5

Vì SQLAlchemy sử dụng metaclasses, mã tạo tham chiếu ngược trên lớp khác sẽ không chạy cho đến khi bạn đã tạo ít nhất một phiên bản của lớp Client.

Biện pháp khắc phục rất đơn giản: tạo một đối tượng Client(), và loại bỏ nó một lần nữa:

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

hoặc sử dụng chức năng configure_mappers tiện ích:

from sqlalchemy.orm import configure_mappers 

để quét mô hình của bạn để tham khảo như vậy và khởi tạo chúng . Tạo ra bất kỳ một cá thể nào gọi phương thức này dưới mui xe, thực sự.

+0

Cảm ơn rất nhiều! Nó thật sự có hiệu quả! –

+0

Tôi nên đặt lệnh gọi hàm configure_mappers ở đâu? – user1111652

+0

@ user1111652: bất kỳ nơi nào được chạy sau khi mô hình của bạn đã được xác định. –

Các vấn đề liên quan