Как выполнить оператор "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"
Кроме того, вы можете выполнить 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, как показано ниже: