我有这样一对多的关系:
class Person(BASE):
__tablename__ = 'person'
__table_args__ = ({'sqlite_autoincrement': True})
idperson = Column(INTEGER,
autoincrement=True,
primary_key=True,
nullable=False)
lastname = Column(VARCHAR(45), index=True, nullable=False)
firstname = Column(VARCHAR(45), index=True, nullable=False)
persontype = Column(VARCHAR(20), default='ORPHANED', nullable=False)
class Document(Base):
__tablename__ = 'document'
__table_args__ = ({'sqlite_autoincrement': True})
iddocument = Column(INTEGER,
autoincrement=True,
primary_key=True,
nullable=False)
person_id = Column(INTEGER, ForeignKey("person.idperson"),
index=True,
nullable=False)
doctag = Column(Varchar(20),
autoincrement=True,
primary_key=True,
nullable=False nullable=False, default='Misc')
datesigned = Column(Date)
person = relationship("Person", foreign_keys=[person_id],
backref=backref("document", uselist=True,
cascade="all, delete-orphan"))
什么是将返回每行一个人的平面列表(适用于网格)的查询 doctag和datesigned为空,除非doctag == && 39; charter' 喜欢:
Smith | Harry | | |
Brown | James | charter | 2/2/16 |
这一点很重要的一点是我将此查询提供给Pyside模型 期望引用从Person开始的属性。所以我不想要基于Document的查询。
此外,实际模型在联接中还有两个表,但我不认为这对这个问题很重要。
我是SQLAlchemy的新手,所以到目前为止我的尝试都被火爆了。
这与文档相关的列没有结果。
self.query = (self.datamod.session.query(Person)
# .join(Schoolmember)
# .join(Student)
.outerjoin(Document))
文档在查询结果中作为列表存在,但我无法像那样访问它们(带括号[0]' s),因为模型基本上是用getattr来填充Pyside视图。登记/> 所以我需要一个大的扁平查询 我试图绕过子查询,但到目前为止它还没有工作。
我认为我需要一个返回所有人员的查询,以及第一个文档,其中过滤器Document.doctag ==' charter'是的 当文档与Person一对一时,这曾经与上面的查询一起正常工作,但我还没有能够适应多对一。
换句话说,我可以合并这两个查询的结果:
query(Person).all()
和
query(Person).outerjoin(Document).filter(Document.doctag=='charter').first()
由于