SQLAlchemy按引用关系的混合属性排序

时间:2014-09-14 17:37:27

标签: python sql sqlalchemy flask-sqlalchemy

我的SQLAlchemy模型:

class Cover(db.Model):
    # ... a bunch of other fields ...

    @hybrid_property
    def number_of_requests(self):
        if self.requests:
            return len(self.requests)
        return 0

    @number_of_requests.expression
    def number_of_requests(cls):
        return func.count(cls.requests)

class Request(db.Model):
    # ... a bunch of other fields ...

    # Cover that this request is requesting
    cover_id = db.Column(db.Integer, db.ForeignKey('cover.id')
    cover = db.relationship('Cover',
                        backref=backref("requests", cascade="all, delete-orphan"))

因此,Cover和Request之间的简单的一对多关系。 number_of_requests混合属性应返回与该特定封面关联的请求数。

现在,在我的一个Flask路线中,我试图通过请求数量来获取前5个封面。这就是现在的样子:

# Get top cover requests
covers = Cover.query.order_by(Cover.number_of_requests).limit(5).all()

不幸的是,这给出了

  

ProgrammingError :( ProgrammingError)缺少表" FROM"

的FROM子句条目

我怀疑这是因为number_of_requests(cls)我试图计算requests列表的大小,但SQLAlchemy没有在原始查询中包含请求表。有关如何做到这一点的任何想法,以避免出现此错误?

1 个答案:

答案 0 :(得分:4)

将您的expression部分更改为:

@number_of_requests.expression
def number_of_requests(cls):
    return (select([func.count(Request.id)])
            .where(Request.cover_id == cls.id))

再次阅读Correlated Subquery Relationship Hybrid