在我的瓶的应用程序,有许多到许多文件和标记之间的关系:的SQLAlchemy:在许多一对多的关系查询过滤计数
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是无。这是多次失败的尝试之一:
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,但我无法得到它的工作......非常感谢! – NTS