【发布时间】:2019-09-09 04:02:15
【问题描述】:
这是对上一个问题here 的跟进。我想计算每个类别中offers的数量,并以我可以在Jinja中迭代的格式输出它们。
新的,3
二手, 7
破碎,5
这是我现在得到的:
class Offer(Base):
CATEGORIES = [
(u'new', u'New'),
(u'used', u'Used'),
(u'broken', u'Broken')
]
__tablename__ = 'offers'
id = sa.Column(sa.Integer, primary_key=True)
summary = sa.Column(sa.Unicode(255))
category = sa.Column(ChoiceType(CATEGORIES))
按照上一个答案,我尝试了这样的事情:
count_categories = db.session.query(
CATEGORIES.value, func.count(Offer.id)).outerjoin(
Offer).group_by(CATEGORIES.key).all()
这显然行不通,因为CATEGORIES.value 没有定义;如何将CATEGORIES 传递给此查询以产生所需的结果? “设置”似乎相当普遍,直接取自SQLAlchemy-Utils Data types page
非常感谢您的帮助(已经长出白头发了)!
一个可怕但有效的临时解决方法:
result = []
for category in Offer.CATEGORIES:
count = db.session.query(func.count(Offer.id)).filter_by(category=category[0]).all()
result.append((category[0], category[1], count[0][0]))
【问题讨论】:
-
您已经非常接近自己解决了这个问题。您知道您需要在类别和商品之间进行外连接,并且您在应用程序代码中有效执行的外连接是丑陋的。允许数据库通过将类别移动到其自己的表中来为您完成繁重的工作,该表由外键连接到 offer 表。您现在可以执行所需的外部连接,并且如果需要,将来还可以轻松添加新类别。
-
@EAW 感谢您的反馈!你说得对;这可能是将其卸载到数据库的唯一方法。我真的希望我能以某种方式将它与
db.session.query合并;可能作为虚拟表。如果我找到解决方案,我会在这里发帖。
标签: python sqlalchemy sqlalchemy-utils