我能否在查询调用中按属性动态更改order峎u?

2024-04-24 19:39:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下查询电话:

SearchList = (DBSession.query(
    func.count(ExtendedCDR.uniqueid).label("CallCount"),
    func.sum(ExtendedCDR.duration).label("TotalSeconds"),
    ExtendedCDR,ExtensionMap)
    .filter(or_(ExtensionMap.exten == ExtendedCDR.extension,ExtensionMap.prev_exten == ExtendedCDR.extension))
    .filter(between(ExtendedCDR.start,datebegin,dateend))
    .filter(ExtendedCDR.extension.in_(SelectedExtension))
    .group_by(ExtendedCDR.extension)
    .order_by(func.count(ExtendedCDR.uniqueid).desc()))
    .all()
)

我希望能够在调用.query()之前定义order_by子句,这可能吗?在

我尝试按照this stackoverflow answer对过滤器规范的建议来做,但是我不知道如何创建过滤器组语法。在

从那篇文章中:

^{pr2}$

Tags: 过滤器bycountextensionorderfilterquerylabel
1条回答
网友
1楼 · 发布于 2024-04-24 19:39:53

使用DBSession.query()调用构建一个SQL查询,在对其调用.all()之前,不会执行该查询。在

您可以存储中间结果,并根据需要添加更多筛选器或其他子句:

search =DBSession.query(
    func.count(ExtendedCDR.uniqueid).label("CallCount"),
    func.sum(ExtendedCDR.duration).label("TotalSeconds"),
    ExtendedCDR,ExtensionMap)
search = search.filter(or_(
    ExtensionMap.exten == ExtendedCDR.extension,
    ExtensionMap.prev_exten == ExtendedCDR.extension))
search = search.filter(between(ExtendedCDR.start, datebegin, dateend))
search = search.filter(ExtendedCDR.extension.in_(SelectedExtension))
search = search.group_by(ExtendedCDR.extension)
search = search.order_by(func.count(ExtendedCDR.uniqueid).desc())

可以提前创建传递给order_by的值:

^{pr2}$

然后使用如下:

search = search.order_by(search_order)

查询完成后,通过调用.all()获得结果:

SearchList = search.all()

相关问题 更多 >