2012-08-09 26 views
5

假設我有以下的SQLAlchemy類中定義:如何確定動態SQLAlchemy關係的類型(例如多對一)?

Base = declarative_base() 

class Person(Base): 
    __tablename__ = 'person' 
    id = Column(Integer, primary_key=True) 
    computers = relationship('Computer', backref=backref('owner', lazy='dynamic')) 

class Computer(Base): 
    __tablename__ = 'computer' 
    id = Column(Integer, primary_key=True) 
    ownerid = Column(Integer, ForeignKey('person.id')) 

進一步假設我已訪問了懶惰的查詢對象是這樣的:

relation = getattr(Computer, 'owner') 

我怎樣才能確定是否relation指的單個實例Person(也就是說,在多對一的關係中,就像在這個例子中一樣),或者如果relation引用了一組實例(就像一對多關係一樣)?換句話說,我如何確定動態SQLAlchemy關係對象的關係類型?

+0

我不確定我是否理解這個問題,但在您的示例中,爲什麼不檢查它是集合(例如列表)還是單個項目?這完全獨立於SQLAlchemy,完全可以利用SQLAlchemy的ORM特性和數據庫抽象。 – javex 2012-09-25 12:59:51

+0

你大部分是正確的:我認爲正確的解決方案是檢查'isinstance(關係,列表)是否 - 如果爲true,那麼我們可以像列表一樣使用它,但如果爲false,則必須調用'relation.one )'以便將關係映射到具體實例。如果你在下面添加一個答案,我可以獎勵你(如果可以的話,請加入我在這裏陳述的警告)。 – argentpepper 2012-10-09 17:14:04

回答

2

如果我們假設model = Computerrelation = 'owner'中的問題,那麼下面的屬性是True當且僅當該關係,而不是一個單一實例的實例列表:

model._sa_class_manager[relation].property.uselist 

然後可以使用此測試是否要調用one()方法上的getattr(model, relation)結果:

if model._sa_class_manager[relation].property.uselist: 
    related_instances = getattr(model, relation) 
else: 
    related_instance = getattr(model, relation).one() 

我不自信,但是,這是最好的解決方案。

相關問題