1

ORM 查询的结果(例如,MyObject.query())需要根据基于不在数据库中的值(即来自单独的搜索引擎)的排名算法进行排序。这意味着“order_by”将不起作用,因为它只对数据库中的字段进行操作。

但是,我不想将查询结果转换为列表,然后重新排序,因为我想保持向查询添加进一步约束的能力。例如:

results = MyObject.query()
results = my_reorder(results)
results = results.filter(some_constraint)

这可以通过 SQLAlchemy 完成吗?

4

1 回答 1

2

恐怕您将无法做到这一点,除非可以从数据库中的对象表和/或相关对象表的字段中派生排序

但是您可以从代码中返回 tuple (query, order_func/result)。在这种情况下,查询仍然可以扩展,直到它被执行,然后再重新使用。或者您可以创建一个类似于 - 的小型Proxy类,其中将包含此元组,并将查询扩展方法委托给查询,并将查询执行方法(all(), __iter__,...)委托给查询并在执行时应用排序。

MyObject此外,如果您可以预先计算每个实例的值,您可以literal在查询中添加一个包含这些值的列,然后使用order_by它进行排序。或者,添加临时表,使用计算的排序值添加行,在查询中加入它并添加排序。但我想这些比它们带来的好处增加了更多的复杂性。

于 2012-05-17T18:40:24.467 回答