Django - 如何以一种有效的方式链接两个查询集并保留排序

时间:2012-04-08 23:52:04

标签: django django-queryset

将两个查询集链接在一起的最佳方法是什么?我尝试过使用itertools.chain()和按位OR。

我对chain()的问题在于它与分页不匹配。因为chain()返回一个列表,所以当与Django的分页一起使用时,我得到“Exception Value:'list'对象没有属性'_clone'。

按位OR也没问题,但它似乎没有保留排序。两个查询集似乎只是组合在一起。我需要将第一个查询集的项放在第二个查询集的项之前。

1 个答案:

答案 0 :(得分:0)

我不知道是否有解决该问题的简单方法。以下解决方案将像魅力一样工作,但这并不简单。

以下列方式定义您自己的QuerySum类:

class QuerySum(object):
    def __init__(self, queries):
        self.queries = queries

    def _clone(self, queries):
        return QuerySum(q._clone() for q in self.queries)

    def __len__(self, queries):
        return sum(len(q) for q in self.queries)

    # you should define rest of the methods that paginator uses in similar manner

使用此实现来链接查询。