当前位置: 首页 > 面试题库 >

如何在Django视图中合并两个或多个查询集?

颛孙庆
2023-03-14
问题内容

我正在尝试搜索我正在构建的Django网站,在该搜索中,我正在搜索3种不同的模型。为了在搜索结果列表上进行分页,我想使用一个通用的object_list视图来显示结果。但是要做到这一点,我必须将3个查询集合并为一个。

我怎样才能做到这一点?我已经试过了:

result_list = []            
page_list = Page.objects.filter(
    Q(title__icontains=cleaned_search_term) | 
    Q(body__icontains=cleaned_search_term))
article_list = Article.objects.filter(
    Q(title__icontains=cleaned_search_term) | 
    Q(body__icontains=cleaned_search_term) | 
    Q(tags__icontains=cleaned_search_term))
post_list = Post.objects.filter(
    Q(title__icontains=cleaned_search_term) | 
    Q(body__icontains=cleaned_search_term) | 
    Q(tags__icontains=cleaned_search_term))

for x in page_list:
    result_list.append(x)
for x in article_list:
    result_list.append(x)
for x in post_list:
    result_list.append(x)

return object_list(
    request, 
    queryset=result_list, 
    template_object_name='result',
    paginate_by=10, 
    extra_context={
        'search_term': search_term},
    template_name="search/result_list.html")

但这是行不通的。当我尝试在通用视图中使用该列表时出现错误。该列表缺少克隆属性。

有谁知道我如何合并三个列表page_list,article_listpost_list


问题答案:

将查询集连接到列表是最简单的方法。如果无论如何将对所有查询集命中数据库(例如,由于需要对结果进行排序),则不会增加成本。

from itertools import chain
result_list = list(chain(page_list, article_list, post_list))

使用itertools.chainitertools在C中实现每个列表和一个元素一个一个地循环添加要快。与在串联之前将每个查询集转换为列表相比,它消耗的内存更少。

现在可以按日期对结果列表进行排序(按照hasen j对另一个答案的评论中的要求)。该sorted()函数方便地接受生成器并返回列表:

result_list = sorted(
    chain(page_list, article_list, post_list),
    key=lambda instance: instance.date_created)

如果你使用的是Python 2.4或更高版本,则可以使用attrgetter而不是lambda。我记得曾经读过关于它更快的文章,但是对于一百万个项目,我没有看到明显的速度差异。

from operator import attrgetter
result_list = sorted(
    chain(page_list, article_list, post_list),
    key=attrgetter('date_created'))


 类似资料:
  • 问题内容: 我想合并两个或多个视频文件(它们可能是两个mp4或两个3gp或任何其他格式)。 问题答案: 您可以使用的最通用的工具是ffmpeg(如上面@Jeremy所述),但是在手机上使用它需要做一些工作。它也是LGPL许可的,其某些编码器(特别是x264)是GPL。 如果您要连接的两个文件都使用类似的编码,并且包含在从MP4派生的文件格式中(例如3GP),那么一个更简单的解决方案是使用纯Java

  • 问题内容: 供参考的是代码。我正在尝试制作一个记录到elasticsearch的hubot插件,然后使用hubot命令搜索那些日志。 https://gist.github.com/4050748 我正在尝试检索与两个查询匹配的记录。 我期待: 多达50条记录 具有给定用户的记录 最近一小时的记录 我有: 最多10条记录 具有给定用户的记录 从任何时候 我如何在过去一小时内获取带有某些用户名的所有

  • 问题内容: 我想将两个选择查询与结合在一起。 如何使用第二个中的第一个结果? 问题答案: 使用 CTE 可以在多个查询中重用子查询的结果。 为此,您需要PostgreSQL 8.4+: 您最有可能想要而不是。不排除重复项,这样可以更快。

  • 问题内容: 我要么变老,要么我需要写的查询变得越来越复杂。以下查询将获取与该用户的所有关联。 该表为(,,,); 现在,我还需要通过 独立查询如下所示: 但是,是否可以将这两个查询合并为一个查询?我的逻辑认为应该这样,尽管我不知道如何进行实际的JOIN。 问题答案: 我可能会使用UNION。

  • 问题内容: 如何合并这两个SQL语句? 两个表中都存在hits10,hits11和hits12。 问题答案: 使用UNION查询-只需在两个查询之间填入“ UNION”即可: 更新 将联合包装在另一个查询中:

  • 问题内容: 我有一个带有两个自定义管理器方法的Django模型。每个对象都基于对象的不同属性返回模型对象的不同子集。 有没有什么方法可以获取一个查询集,或者只是一个对象列表,那就是每个管理器方法返回的查询集的并集? 问题答案: 这可以工作,看起来更干净: 如果你不希望重复,则需要添加: