Py学习  »  Django

在Django中,|运算符在我将两个queryset合并在一起时创建重复项

Evelyn Chin • 5 年前 • 1573 次点击  

这是一件非常奇怪的事情,因为我知道|操作符应该在不复制对象的情况下创建两个queryset的并集。我正在尝试执行查询搜索,并获取要在页面上显示的对象集。其中一套是用来装柱子的。

以下是我的代码片段:

if query:
        block_list = Block.objects.filter(Q(name__icontains=query) | Q(tags__slug__icontains=query))
        user_list = CustomUser.objects.filter(Q(first_name__icontains=query) | 
                    Q(last_name__icontains=query) | Q(username__icontains=query))
        post_list = Post.objects.filter(Q(tags__slug__icontains=query))
        post_list_by_title = Post.objects.filter(Q(title__icontains=query))
        print(post_list)
        print(post_list_by_title)
        print(post_list | post_list_by_title)

<QuerySet []>
<QuerySet [<Post: Post1>]>
<QuerySet [<Post: Post1>, <Post: Post1>, <Post: Post1>]>

如果你想知道我为什么要按标签和标题拆分post_列表,我原来有:

post_list = Post.objects.filter(Q(tags__slug__icontains=query) | Q(title__icontains=query))

<QuerySet [<Post: Post1>, <Post: Post1>, <Post: Post1>]>

都一样。你知道为什么会这样吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/57014
 
1573 次点击  
文章 [ 2 ]  |  最新文章 5 年前
DARK_C0D3R
Reply   •   1 楼
DARK_C0D3R    5 年前

.distinct() 之后 .filter 为了删除查询本身中的重复项,同时它还将获取两个相同(3之前)的对象,您可以在 (post_list | post_list_by_title)

Arakkal Abu
Reply   •   2 楼
Arakkal Abu    5 年前

尝试 OR ing的 Q 对象和稍后调用 distinct() 方法,

qs_without_dup = Post.objects.filter(Q(tags__slug__icontains=query)|Q(title__icontains=query)).distinct()