SyntaxError: аргумент ключевого слова повторен
У меня есть следующий набор запросов,
site_list = SiverifyVerificationSite.objects.filter(pattern_id=int(p_id), if_target=bundle.obj.pattern.if_target).exclude(ptrf__istartswith='ptrf-mt23run1-')
Это работает, если я даю один фильтр исключения, тогда как, если я включаю второй фильтр в исключение, он выбрасывает (SyntaxError: ключевое слово-аргумент повторяется). В идеале то, что я хочу,
site_list = SiverifyVerificationSite.objects.filter(pattern_id=int(p_id), if_target=bundle.obj.pattern.if_target).exclude(ptrf__istartswith='ptrf-mt23run1-', ptrf__istartswith='ptrf-20251-')
Есть ли операторы для этого. Благодарю.
2 ответа
Вы можете просто добавить в цепочку исключения:
qs = qs.exclude(ptrf__istartswith='ptrf-mt23run1-')
qs = qs.exclude(ptrf__istartswith='ptrf-20251-')
Таким образом, это не вызывает никаких дополнительных запросов - Django не будет оценивать набор запросов до тех пор, пока это не будет необходимо.
Альтернативой является создание фильтра с Q
объекты.
from django.db.models import Q
q = Q(ptrf__istartswith='ptrf-mt23run1-') | Q(ptrf__istartswith='ptrf-20251-')
qs = qs.exclude(q)
Я получил ту же ошибку ниже:
SyntaxError: повторяется аргумент ключевого слова: post__contains
При написании кода filter( )
с 2post__contains
аргументы в
test()
view для запуска оператора , как показано ниже:
# "store/views.py"
from .models import Blog
from django.http import HttpResponse
def test(request):
# Here
qs = Blog.objects.filter(
post__contains="popular", post__contains="simple"
) # ↑ ↑ ↑ Here ↑ ↑ ↑ # ↑ ↑ ↑ Here ↑ ↑ ↑
print(qs)
return HttpResponse("Test")
Итак, я использовалили Q() и
&
бежать
AND
оператор с
filter()
как показано ниже:
# "store/views.py"
from .models import Blog
from django.db.models import Q
from django.http import HttpResponse
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