【问题标题】:Django - How to chain two querysets in such a way that's efficient and preserves orderingDjango - 如何以高效并保留顺序的方式链接两个查询集
【发布时间】:2012-04-21 11:46:36
【问题描述】:

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

chain() 的问题是它不能很好地适应分页。因为chain()返回一个列表,当与Django的分页一起使用时,我得到“异常值:'list'对象没有属性'_clone'”。

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

【问题讨论】:

  • chain 不返回list,而是返回chainitertools 函数/类都没有返回序列,它们都返回可迭代对象。

标签: django django-queryset


【解决方案1】:

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

通过以下方式定义您自己的 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

使用此实现链接查询。

【讨论】:

    猜你喜欢
    • 2013-08-16
    • 2013-11-18
    • 2018-03-06
    • 2018-01-17
    • 2017-03-13
    • 2019-08-11
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多