2017-03-17 8 views
2

ich die unten queryset haben,Syntax: Stichwort Argument wiederholt

site_list = SiverifyVerificationSite.objects.filter(pattern_id=int(p_id), if_target=bundle.obj.pattern.if_target).exclude(ptrf__istartswith='ptrf-mt23run1-') 

Es funktioniert, wenn ich einen Filter ausschließen geben während Wenn ich den zweiten Filter enthalten in ausschließen wirft (Syntaxerror: Schlüsselwort-Argument wiederholt). Idealerweise ist das, was ich will,

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-') 

Gibt es irgendwelche Betreiber, dies zu tun. Vielen Dank.

Antwort

2

Sie können die Kette nur die umfasst nicht:

qs = qs.exclude(ptrf__istartswith='ptrf-mt23run1-') 
qs = qs.exclude(ptrf__istartswith='ptrf-20251-') 

Es keine zusätzlichen Abfragen auf diese Weise verursacht - Django nicht die queryset bis notwendig bewerten.

Eine Alternative ist der Aufbau des Filters mit Q Objekten.

from django.db.models import Q 
q = Q(ptrf__istartswith='ptrf-mt23run1-') | Q(ptrf__istartswith='ptrf-20251-') 
qs = qs.exclude(q) 
+0

Kette funktioniert. Ich habe mich gefragt, ob es irgendwelche Operatoren dafür geben könnte. –

+0

Es gibt. Eine alternative Option wurde hinzugefügt, die '|' operator auf 'Q' Objekte verwendet. Ich denke, dass die Verkettung besser lesbar ist. – wim

Verwandte Themen