Peewee:查询 field/column 的 SUM

Peewee: Querying SUM of field/column

我一直在尝试计算 peewee 中 field/column 的总和。我以为这很简单,但我现在已经兜圈子几个小时了。

我只想从查询中返回总价格 field/column。

我一直在使用的代码示例是:

型号

class Package(db.Model):
    id = PrimaryKeyField()
    code = CharField(max_length=11, unique=True, null=False)
    price = DecimalField(null=False, decimal_places=2)
    description = TextField()
    created = DateTimeField(default=datetime.now, null=False)
    updated = DateTimeField(default=datetime.now, null=False)

查询

    sum_total = fn.SUM(Package.price).alias('sum_total')
    query = (Package
        .select(sum_total)
        .order_by(sum_total)
    )

我得到的输出是:

query.sum_total

AttributeError: 'ModelSelect' object has no attribute 'sum_total'

for q in query: logger.debug(json.dumps(model_to_dict(q)))

{"code": null, "created": null, "description": null, "id": null, "numberOfTickets": null, "price": null, "updated": null}

我确信我遗漏了一些非常简单的东西。我无法在 peewee 文档之外找到任何示例,我已经尝试过这些示例,但仍然一无所获。

有什么想法吗?

“model_to_dict()”方法并不神奇。它不会自动推断您实际上只想将“sum_total”列转储到字典中。此外,您是否正在尝试获取数据库中 all 行的总和?如果是这样,这只是一个标量值,所以你可以写:

total = Package.select(fn.SUM(Package.price)).scalar()
return {'sum_total': total}

如果您想按其他一些列对总计进行分组,您需要 select 这些列并指定适当的 group_by() - 例如,此按代码对总计进行分组:

sum_total = fn.SUM(Package.price).alias('sum_total')
query = (Package
         .select(Package.code, sum_total)
         .group_by(Package.code)
         .order_by(sum_total))
accum = []
for obj in query:
    accum.append({'code': obj.code, 'sum_total': obj.sum_total})