2017-03-13 19 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中的queryset,從而使代碼更短。

您也可以將過濾那些模型,甚至它只會調用數據庫一次(query sets are lazy

原始answer to my question

霍普這可以幫助別人的未來。

+0

非常好的@adrian。非常好。我正準備和你一樣寫出同樣的答案。去的路! –

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,之後將通過其他參數過濾結果。使用字典的另一個好處是,您可以輕鬆修改過濾器並構建新過濾器,而無需使用許多條件。我的答案是爲此目的而設計的....對於這個例子來說,你的答案更好。 –