0

这是对上一个问题的跟进。我想计算每个类别中的 offer 数量,并以我可以在 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 数据类型页面

非常感谢您的帮助(已经长出白头发了)!


一个可怕但有效的临时解决方法:

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]))
4

1 回答 1

0

要计算每个类别的报价数量,您需要在类别和报价之间进行外部连接。鉴于您没有将类别存储为数据库表,您必须在不理想的应用程序代码中执行此操作。您只需要创建一个新的类别表并将用户表中的类别字段替换为连接到新类别表的外键。下面的代码演示了这一点。

class Offer(Base):
    __tablename__ = 'offers'
    id = sa.Column(sa.Integer, primary_key=True)
    summary = sa.Column(sa.Unicode(255))
    category_id = sa.Column(sa.Integer, sa.ForeignKey("categories.id"))
    category = sa.orm.relationship("Category", back_populates="offers")

class Category(Base):    
    __tablename__ = 'categories'
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.Unicode(6), unique=True)
    offers = sa.orm.relationship("Offer", back_populates="category")

# populate categories with the same values as your original enumeration
session.add(Category(name="New"))
session.add(Category(name="Used"))
session.add(Category(name="Broken"))

count_categories = session.query(Category.name, func.count(Offer.id)). \
    select_from(Category).outerjoin(Offer).group_by(Category.name).all()
于 2019-04-23T11:06:14.793 回答