Как выполнить оператор "AND" с "filter()" без ошибки "SyntaxError: keyword argument repeated:" в Django?

У меня есть Blog модель ниже. * Я использую Django 3.2.16 и PostgreSQL:

# "store/models.py"

from django.db import models

class Blog(models.Model):
    post = models.TextField()
    
    def __str__(self):
        return self.post

Тогда, store_blog таблица имеет 2 строки ниже:

store_blog таблица:

id post
1 Python is popular and simple.
2 Java is popular and complex.

Затем, при написании кода filter() с 2 аргументами post__contains в представлении test() для выполнения оператора AND как показано ниже:

# "store/views.py"

from .models import Person

def test(request):
    # Here
    qs = Blog.objects.filter(
             post__contains="popular", post__contains="simple"
         )
    print(qs)

    return HttpResponse("Test")

Я получил ошибку ниже:

SyntaxError: повтор аргумента ключевого слова: post__contains

Итак, как выполнить AND оператор с filter() без SyntaxError: keyword argument repeated: ошибки в Django?

Вы можете выполнить AND оператор с filter(), используя & или используя Q() и &, как показано ниже:

# "store/views.py"

from .models import Person
from django.db.models import Q

def test(request):

    # With "&"
                                                     # ↓ Here
    qs = Blog.objects.filter(post__contains="popular") & \
         Blog.objects.filter(post__contains="simple")
    print(qs)

    # With "Q()" and "&" 
                           # ↓ Here                    # ↓ Here
    qs = Blog.objects.filter(Q(post__contains="popular") & 
                             Q(post__contains="simple"))
    print(qs)              # ↑ Here

    return HttpResponse("Test")

Затем, вы можете получить результат ниже:

<QuerySet [<Blog: Python is popular and simple.>]> # With "&"
<QuerySet [<Blog: Python is popular and simple.>]> # With "Q()" and "&"
[22/Dec/2022 12:08:22] "GET /store/test/ HTTP/1.1" 200 9

И есть AND операторы согласно журналам запросов PostgreSQL как показано ниже, и вы можете проверить В PostgreSQL, как регистрировать запросы с транзакционными запросами, такими как "BEGIN" и "COMMIT"

enter image description here

Кроме того, вы можете выполнить OR оператор с filter() с помощью | или используя Q() и |, как показано ниже:

# "store/views.py"

from .models import Person
from django.db.models import Q

def test(request):

    # With "&"
                                                     # ↓ Here
    qs = Blog.objects.filter(post__contains="popular") | \
         Blog.objects.filter(post__contains="simple")
    print(qs)

    # With "Q()" and "&" 
                           # ↓ Here                    # ↓ Here     
    qs = Blog.objects.filter(Q(post__contains="popular") | 
                             Q(post__contains="simple"))
    print(qs)              # ↑ Here
                       
    return HttpResponse("Test")

Затем, вы можете получить результат ниже:

<QuerySet [<Blog: Python is popular and simple.>, <Blog: Java is popular and complex.>]>
<QuerySet [<Blog: Python is popular and simple.>, <Blog: Java is popular and complex.>]>
[22/Dec/2022 12:56:41] "GET /store/call_test/ HTTP/1.1" 200 9

И есть OR операторы согласно журналам запросов PostgreSQL, как показано ниже:

enter image description here

Вернуться на верх