2017-03-13 13 views
0

私は数時間前に質問を投稿しましたが、重複しているとマークされていましたが、ここで答えを見つけられませんでしたので、別の場所で見つけなければなりませんでした。複数のオプションのフィルタをDjangoで簡略化する

ここに質問があります: djangoの多くのオプションフィルタを簡略化する方法。たとえば: モデル= "some_rare_model"

if max_speed: 
    if year: 
     if color: 
      cars = Car.objects.filter(model=model,max_speed=max_speed,year=year,color__icontains=color) 
     else: 
      car = Car.objects.filter(model=model,max_speed=max_speed,year=year) 
    else: 
     if color: 
      cars = Car.objects.filter(model=model,max_speed=max_speed,color__icontains=color) 
     else: 
      cars = Car.objects.filter(model=model,max_speed=max_speed) 
else: 
    if year: 
     if color: 
      cars = Car.objects.filter(model=model,year=year,color__icontains=color) 
     else: 
      car = Car.objects.filter(model=model,year=year) 
    else: 
     if color: 
      cars = Car.objects.filter(model=model,color__icontains=color) 
     else: 
      cars = Car.objects.filter(model=model) 

どのようにコードを単純化するには?

答えて

0

このコードを簡略化するために、辞書を使用できます。例えば

、あなたは「青」が含まれている色で、これらの車をフィルタリングしたい場合:

だから、
cars = Car.object.filter(**{'color__icontains'='blue'}) 

、色をフィルタリングするために、年とMAX_SPEED与えられたならば、我々はこのような何かを構築することができます。

filters = {"model":'some_rare_model'} 
if color: 
    filters['color__icontains'] = color 
if year: 
    filters['year'] = year 
if max_speed: 
    filters['max_speed'] = max_speed 
cars = Car.objects.filter(**filters) 

8行のコードと24のコードは大きな進歩であり、より明確でもあります。たとえば、クエリーセットのURLにあるすべてのキーと値を含む辞書を返す関数を作成して、コードをさらに短くすることもできます。

また、これらのモデルをフィルタリングしておくことができ、さらにはそれが一度だけ(query sets are lazy

オリジナルanswer to my questionデータベースを呼び出します:

ホッペが、これは将来的に誰かを助けます。

+0

非常に素晴らしい@adrian。非常に素晴らしい。私はあなたと同じ答えを書こうとしていました。行きたい! –

1

辞書を渡すのは良いアプローチですが、もう1つは以下のとおりです。クエリーセットは使用されるまで評価されず、必要なだけ変更できます。 だからあなたはあなたが好きなだけを行うことができ、この

cars = Car.objects.filter(model=model) 
if max_speed: 
    cars = cars.filter(max_speed=max_speed) 
if year: 
    cars = cars.filter(year=year) 
if color: 
    cars = cars.filter(color__icontains=color) 

ような何かを行うことができます。それはとても冗長です。

編集:あなたはまた、クエリーセットが怠け者だと言いました。私はまだこの回答を残しておきますので、将来誰かを助けるかもしれません。

+0

どちらも良いアプローチです。違いは、最初のものが同時にすべてのフィルタを評価することです。これは最初のmax_speedを評価し、その後は他のパラメータで結果をフィルタリングします。辞書を使用するもう一つの良い点は、フィルタを簡単に変更でき、多くの条件を使わずに新しいフィルタを簡単に作成できることです。私の答えはその目的のために作られたものです。 –

関連する問題