В Django, | Оператор создает дубликаты, когда я объединяю два набора запросов - PullRequest
1 голос
/ 29 марта 2020

Это действительно странная вещь, потому что я понимаю | оператор должен создать объединение двух наборов запросов без дублирования объектов. Я пытаюсь выполнить поиск запроса и получить наборы объектов для отображения на странице. Один из этих наборов предназначен для сообщений.

Вот фрагмент моего кода:

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)

Вот результат выполнения трех команд печати в cmd.

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

Если вам интересно, почему я разделил post_list по тегу и post_list по заголовку, у меня изначально было:

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

Но когда я печатал post_list, он все равно получился:

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

все тоже самое. У вас есть идеи, почему это может быть?

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Вы можете использовать .distinct() после .filter, чтобы удалить дубликаты в самом запросе, но затем он также выберет 2 одинаковых (до 3) объекта, для которых вы можете использовать различные в вашем (post_list | post_list_by_title)

0 голосов
/ 29 марта 2020

Попробуйте OR с Q объектами и позже вызовите distinct() метод,

qs_without_dup = Post.objects.filter(<b>Q(tags__slug__icontains=query)|Q(title__icontains=query)).distinct()</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...