1 過濾:篩選查詢結果 2 內置篩選的使用 -在視圖類中配置 filter_backends =[SearchFilter,] search_fields=('name','age') # 表模型中的字段,表示查詢name或age字段裏面有須要查的,可模糊查 -查詢的時候 http://127.0.0.1:8000/students/?search=e #表示查name 或 age裏有e的用戶信息 3 第三方擴展的過濾功能 安裝: -pip3 install django-filter :注意最新版本(2.4.0)要跟django2.2以上搭配
-django-filter有不少功能,好比:模糊查詢以什麼開頭,結尾,這個或那個等高級功能,後面會說。 使用: -在視圖類中配置 filter_backends =[DjangoFilterBackend,] filter_fields=['name','age'] #精準過濾,表示查看name爲xx,age爲xx的用戶,也可寫一個name 或age -查詢的時候 http://127.0.0.1:8000/students/?name=lqz#查name=lqz的用戶 http://127.0.0.1:8000/students/?age=18#查age=18的用戶 http://127.0.0.1:8000/students/?name=lqz&age=18#查name=lili而且age=18的用戶
#源碼分析: -查詢全部纔會有過濾---》list才須要過濾---》queryset = self.filter_queryset(self.get_queryset())---》GenericAPIView-->filter_queryset def filter_queryset(self, queryset): for backend in list(self.filter_backends): queryset = backend().filter_queryset(self.request, queryset, self) return queryset
本身編寫django
也能夠再基於django-filter擴寫,使得功能更強大 1 寫一個類MyFilter,繼承BaseFilterBackend 2 重寫filter_queryset方法,在該方法內部進行過濾(本身設置的過濾條件) 3 返回queryset對象(過濾後的queryset對象) 4 配置在視圖類中 filter_backends = [MyFilter,] #若是是一個類能夠直接寫成filter_backends = MyFilter,由於源碼裏面本身會list一下,變成列表
代碼實現:源碼分析
略spa
-在視圖類中配置 filter_backends =[OrderingFilter,] ordering_fields=['id','age'] -查詢的時候 http://127.0.0.1:8000/students/?ordering=age #按age排 http://127.0.0.1:8000/students/?ordering=-id#按-id排 http://127.0.0.1:8000/students/?ordering=-age,-id #當要排序的用戶age相同時,按照-id排,是有意義的,要考慮實際應用 ### 過濾後再排序 -在視圖類中配置 filter_backends = [OrderingFilter,DjangoFilterBackend] ordering_fields = ('id', 'age') filter_fields=['name','age'] -查詢的時候 http://127.0.0.1:8000/students/?name=lqz&age=19&ordering=-age,-id #篩選出name=lqz而且age=19的用戶,而後按照-age排,若是age再相同,按照-id排