2017-08-01 56 views
1

我使用DRF,並且我有模型Motocycle,它在數據庫中有> 2000個對象。模型有一個品牌。我想通過FULL_NAME搜索:註解字段的Django過濾器太慢

queryset = Motocycle.objects.prefetch_related(
     "brand" 
     ).annotate(
      full_name=Concat(
       'brand__title', 
       Value(' - '), 
       'title', 
      ) 
     ) 
    ) 

我想通過FULL_NAME過濾,但查詢運行速度非常慢:

(1.156) SELECT "mp_api_motocycle"."id"... 

不與分頁過濾:

(3.980) SELECT "mp_api_motocycle"."id"... 

有一些有可能使這個查詢更快?

回答

1

將您的full_name註釋保留爲數據庫中的列,併爲其添加索引。

否則,您在計算full_name時進行全表掃描,然後按它進行排序。

+0

'full_name'將是一個數據庫列和models屬性,它將在模型保存之前更新?或者我把你誤解爲錯誤?謝謝。 –

+0

是的,它會是模型領域,它會保存更新,它可以說是有點非規範化,以獲得性能 – iklinac

+1

此外,爲什麼你使用prefetch_related如果只有一個品牌,更好使用select_related – iklinac