【发布时间】:2015-04-12 17:48:49
【问题描述】:
在我的 Flask 应用中,文档和令牌之间存在多对多的关系:
DocTokens = db.Table(
'DocTokens',
db.Column('token_id', db.Integer, db.ForeignKey('Token.id')),
db.Column('document_id', db.Integer, db.ForeignKey('Document.id')),
)
class Token(db.Model):
__tablename__ = 'Token'
id = db.Column(db.Integer, primary_key=True)
...
is_gold = db.Column(db.Boolean, default=None)
class Document(db.Model):
__tablename__ = 'Document'
id = db.Column(db.Integer, primary_key=True)
...
tokens = db.relationship(
'Token',
secondary=DocTokens,
backred=db.backref('documents', lazy='dynamic'),
)
我想构建一个文档查询,按相关令牌的数量排序(降序)其中 Token.is_gold 为无。
到目前为止,我已经弄清楚了如何按相关令牌的数量对文档进行排序:
db.session.query(
Document,
func.count(DocTokens.c.token_id).label('total')
).join(DocTokens).group_by(Document).order_by('total DESC')
但是,我似乎无法使该计数仅包括 Token.is_gold 为 None 的令牌。这是许多失败的尝试之一:
db.session.query(
Document,
func.count(DocTokens.c.token_id)
.filter(Token.is_gold.is_(None)).label('total')
).join(DocTokens).group_by(Document).order_by('total DESC')
它抛出了以下错误:
AttributeError: Neither 'count' object nor 'Comparator' object has an attribute 'filter'
以下是我尝试建模的一些 StackOverflow 解决方案(包括涉及子查询和混合属性的解决方案):
- How to order by count of many-to-many relationship in SQLAlchemy?
- Sort by Count of Many to Many Relationship - SQLAlchemy
- SQLAlchemy ordering by count on a many to many relationship
- order by a method contained within a class in SQLAlchemy
我对 SQL/SQLAlchemy 还很陌生...非常感谢任何帮助!
【问题讨论】:
-
你能用普通的sql表达你的查询吗?
-
感谢您在我回复您的评论之前回答问题。我尝试了几个小时来制定 sql,但我无法让它工作......非常感谢!
标签: python sqlalchemy flask-sqlalchemy