python - 如何确定动态 SQLAlchemy 关系的类型(例如多对一)?

标签 python 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 关系对象的关系类型?

最佳答案

如果我们假设 model = Computerrelation = 'owner' 在问题中,那么当且仅当以下属性为 True如果关系是实例列表而不是单个实例:

model._sa_class_manager[relation].property.uselist

然后您可以使用它来测试是否对 getattr(model, relation) 的结果调用 one() 方法:

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

但是,我不确定这是最好的解决方案。

关于python - 如何确定动态 SQLAlchemy 关系的类型(例如多对一)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11877899/

相关文章:

python - SQLAlchemy:使用 `and` 和 `or` 时出现意外结果

python - 如何在 Python 中对模块级对象进行更改? (如 Pylons 元对象)

python-2.7 - 将数据插入特定表(sqlalchemy)

python - 如何查询学生所在类(class)的文件?

python - 如何在每个垂直条上添加多个水平条?

python - SQLAlchemy:如何使用连接删除

python - 删除数字末尾的点

python - tensorflow 找到到真实点的最小距离

python - 使用 Python 在 Google Sheets API v4 中编写

python - pytrends(谷歌趋势)每日频率