2016-05-17 5 views
1

Ich versuche, einfache Django-Filter zu tun.Filter wenn request.get() ist Parameter ist nicht gesetzt

Hier ist meine Codezeile, die Filterung zu tun:

cars = models.CarForRent.objects.filter(car_in_city=request.GET.get('city')).filter(travel_abroad=request.GET.get('travel_abroad')) 

Jetzt nur funktioniert, wenn alle Parameter eingestellt ist. Wenn ich einen leeren request.GET.get ('city') oder einen leeren request.GET.get ('travel_abroad') Parameter übergebe, gibt er keinen zurück.

Wie mache ich, wenn request.GET.get ('city') leer ist, um alle Artikel in allen Städten zurückzugeben?

Natürlich könnte ich schreiben, wenn es für jeden get-Parameter ist, aber es muss leichter sein.

Antwort

2

Zunächst einmal können Sie Ihren Code Lesbarkeit verbessern, indem Modell importieren Sie filtern:

from models import CarForRent 

Wenn Sie die manuelle Filterung tun Sie ifs verwenden müssen.

city = request.GET.get('city') 
travel_abroad=request.GET.get('travel_abroad') 
cars = CarForRent.objects.all() 

if city: 
    cars = cars.filter(car_in_city=city) 
if travel_abroad: 
    cars = cars.filter(travel_abroad=travel_abroad) 

Alternative ist, die Parameter leer etwas wie https://github.com/carltongibson/django-filter zu verwenden.

1

Wenn Sie viele Felder hatte, dann könnte es sich lohnen, die Filterung in einer Schleife zu tun:

cars = models.CarForRent.objects.all() 
for fieldname in ['city', 'travel_abroad', ...]: 
    if request.GET.get('fieldname'): 
     cars = cars.filter(**{fieldname: request.GET[fieldname]}) 

Wenn Sie nur ein paar Felder, dann ein paar if-Anweisungen ist wahrscheinlich am einfachsten.

1

IMO, the Q object kann in diesem Fall zum Filtern nützlich sein.

from django.db.models import Q 

city = request.GET.get('city') 
travel = request.GET.get('travel_abroad') 

q = Q() 
if city: 
    q &= Q(car_in_city=city) 
if travel: 
    q &= Q(travel_abroad=travel) 

qryset = CarForRent.objects.filter(q) 

Sie können auch OR-Operation anstelle von UND verwenden.

Verwandte Themen