使用非sql排名在SQL-alchemy中进行排序和分页

mgo*_*ser 15 python pagination sqlalchemy flask flask-sqlalchemy

我有一个python算法,它返回给定用户的数据库行的排名顺序.此算法输出主键ID列表(这些键可以与post.id连接).它看起来像下面,除了可能有数千个匹配:

result_rank = [1286, 1956, 6759, 3485, 2309, 3409, 9023, 912, 13098, 23489, 19023, 1239]
Run Code Online (Sandbox Code Playgroud)

我想指示sqlalchemy选择这些行,并按照它们在列表中的排序顺序排序.问题是,我想对此进行分页

results = posts.query().filter(posts.id.in_(
    resultIds)).order_by(??? how can I order by post.id = result_rank ???).paginate(page_num, posts_per_page)
Run Code Online (Sandbox Code Playgroud)

我使用Postgresql作为数据库.

mgo*_*ser 1

除非有一个好的解决方案,否则我将把我自己的分页对象拼凑在一起:

class paginate_obj:

    """ Pagination dummy object. Takes a list and paginates it similar to sqlalchemy paginate() """
    def __init__(self, paginatable, page, per_page):
        self.has_next = (len(paginatable)/per_page) > page
        self.has_prev = bool(page - 1)
        self.next = page + self.has_next
        self.prev = page - self.has_prev
        self.items = paginatable[(page-1)*(per_page):(page)*(per_page)]
Run Code Online (Sandbox Code Playgroud)

我认为排序的唯一方法是创建所有结果的列表,并根据某些 lambda 函数在 python 中对其进行排序:

results = my_table.query().all()
results.sort(key=lamba x: distance(x.lat, x.long, user_lat, user_long)
paginated_results = paginate_obj(results, 1, 10) #returns the first page of 10 elements
Run Code Online (Sandbox Code Playgroud)