假设我定义了以下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'))
Run Code Online (Sandbox Code Playgroud)
进一步假设我以这种方式访问了惰性查询对象:
relation = getattr(Computer, 'owner')
Run Code Online (Sandbox Code Playgroud)
我如何确定是否relation引用单个实例Person(即多对一关系,如本示例中),或者是否relation引用实例集合(如一对多关系)?换句话说,如何确定动态SQLAlchemy关系对象的关系类型?
如果我们假设model = Computer并且relation = 'owner'如问题中所示,那么True当且仅当关系是实例列表而不是单个实例时,以下属性才是:
model._sa_class_manager[relation].property.uselist
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用它来测试是否对one()以下结果调用该方法getattr(model, relation):
if model._sa_class_manager[relation].property.uselist:
related_instances = getattr(model, relation)
else:
related_instance = getattr(model, relation).one()
Run Code Online (Sandbox Code Playgroud)
然而,我并不确信这是最好的解决方案。