2011-11-22 30 views

回答

4

對於理解backref請給定的例子

from sqlalchemy import create_engine, ForeignKey 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relationship, backref 
from sqlalchemy import Column, Integer, String 
from sqlalchemy import Table, Text 

engine = create_engine('mysql://root:[email protected]/alctest', 
      echo=False) 

Base = declarative_base() 

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key = True) 
    name = Column(String(100)) 
    fullname = Column(String(100)) 
    password = Column(String(100)) 

    def __init__(self, name, fullname, password): 
     self.name = name 
     self.fullname = fullname 
     self.password = password 

     def __repr__(self): 
     return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password) 


class Address(Base): 
    __tablename__ = 'addresses' 
    id = Column(Integer, primary_key = True) 
    email_address = Column(String(100), nullable=False) 

    #foreign key, must define relationship 
    user_id = Column(Integer, ForeignKey('users.id')) 
    user = relationship("User", backref = backref('addresses',order_by=id)) 

這是很簡單的例子。現在如果您想訪問addressesuser,那麼您可以直接從user_id屬性獲得屬性,如果addresses模型。這將返回userid

如果您想要與此addresses關聯的user的對象,那麼您必須使用get()方法與user_id

現在,在相反的情況下,如果你要訪問的useraddresses,那麼你必須像

SELECT * FROM addresses WHERE user_id = $1 

運行查詢但是,如果你會使用backref那麼當您訪問屬性的SQLAlchemy將運行此查詢。

現在在我們的例子還有,如果你將訪問userobject.addresses然後它會運行查詢

SELECT * FROM addresses WHERE user_id = userobject.id 

有一個在User模型像addresses沒有屬性,這將通過backrefAddress模型user屬性進行設置。

相關問題