Flask-Sqlalchemy - 如何组合查询结果

时间:2016-11-07 19:07:12

标签: python sqlalchemy flask-sqlalchemy

所以我有2个sqlalchemy模型定义为:

class Page(db.Model):
    __tablename__ = 'pages'

    id = db.Column(db.Integer, primary_key=True)
    directories = db.relationship('Directory', secondary=pages_dirs_table, backref='pages')

class Directory(db.Model, CRUDMixin):
    __tablename__ = 'directories'

    name = db.Column(db.String, nullable=False)
    parent_id = db.Column(db.Integer, db.ForeignKey('directories.id'))
    children = db.relationship("Directory",
                           cascade="all",
                           backref=db.backref("parent", remote_side='Directory.id'),
                           collection_class=mapped_collection(lambda x: x.name.lower()))

我正在尝试创建查询以查找具有特定父目录的所有页面和目录。也就是说,对于特定的X,任何父级为X的目录和其目录包含X的任何页面。

因此,显而易见的解决方案是形成2个单独的查询,这两个查询都可以单独工作。

Page.query.filter(Page.directories.contains(X)).all()

Directory.query.filter(Directory.parent == X).all()

但是,我需要将这些结果合并到1个列表中并加以分页。理想情况下,我想在.all()步骤之前将它们组合在一起(将被一个.limit().offset().all()替换。)

所以我的数据库知识有点受限,但我尝试了以下内容:

Page.query.join(Directory) ...

但这与sqlalchemy.exc.InvalidRequestError: Could not find a FROM clause to join from. Tried joining to <class 'site_editor.modules.pages.models.Directory'>, but got: Can't find any foreign key relationships between 'pages' and 'directories'.

崩溃了

然后我尝试通过db.session并在查询中使用多个表来进行...如db.session.query(Page, Directory).filter(Directory.parent == X, Page.directories.contains(X))。但这是查询(页面,目录)的元组,这不是很有用,因为我需要一个或另一个,而不是两者。

我想我只是缺少一些关于如何使用数据库连接创建复杂查询的核心理解......

任何帮助将不胜感激,

感谢。

0 个答案:

没有答案