ORM查询的结果(例如,MyObject.query())需要根据基于不在数据库内的值(即来自单独的搜索引擎)的排序算法来排序。这意味着'order_by'将不起作用,因为它只对数据库中的字段进行操作。
但是,我不想将查询结果转换为列表,然后重新排序,因为我希望保持为查询添加更多约束的能力。 E.g:
results = MyObject.query()
results = my_reorder(results)
results = results.filter(some_constraint)
这可以通过SQLAlchemy完成吗?
答案 0 :(得分:2)
我担心你将无法做到这一点,除非可以从数据库中 的对象表和/或相关对象表的字段派生排序
但您可以从代码中返回元组(query, order_func/result)
。在这种情况下,查询可以继续扩展,直到它被执行,然后求助。或者你可以创建一个类似于Proxy
的小类,它将包含这个元组,并将查询扩展方法委托给查询,并将查询执行方法(all(), __iter__
,...)委托给执行时查询并应用排序。
此外,如果您可以预先计算每个MyObject
实例的值,则可以使用值为查询添加literal
列,然后使用order_by
按顺序排序。或者,添加临时表,添加具有计算排序值的行,在查询中连接它并添加排序。但我认为这些增加的复杂性超过了它们带来的好处。