2016-05-17 8 views
1

私は単純なdjangoフィルタを実行しようとしています。ここでrequest.get()がパラメータが設定されていない場合にフィルタ

は、フィルタリングを行う私のコードの行である:すべてのパラメータが設定されている場合

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

は今、それだけで動作します。空白のrequest.GET.get( 'city')または空のrequest.GET.get( 'travel_abroad')パラメータを送信すると、noneを返します。

request.GET.get( 'city')がすべての都市のすべてのアイテムを返すために空である場合の作成方法?

私はそれぞれのパラメータを取得することができますが、それは簡単な方法でなければなりません。

答えて

2

まず第一に、あなたはフィルタリングされたモデルをインポートすることで、コードの可読性を向上させることができます:

from models import CarForRent 

手動フィルタリングを行っている場合は、IFSを使用する必要があります。

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) 

代わりに、空白のパラメータを許可するhttps://github.com/carltongibson/django-filterのようなものを使用します。あなたは多くのフィールドを持っていた場合、それはループ内でフィルタリングを行う価値があるかもしれません

1

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

あなただけのフィールドのカップルを持っている場合は、if文のカップルは、おそらく最も簡単です。

1

IMO、the Q objectはこの場合フィルタリングに役立ちます。

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) 

また、ANDの代わりにOR演算を使用することもできます。

関連する問題