1. 程式人生 > >DRF的兩種View層過濾方式

DRF的兩種View層過濾方式

backend clas 最大 erb 最小值 覆寫 nds object rest

一般過濾可以重寫get_queryset方法實現,這時候就可以去掉queryset這個屬性了:

class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination

    # 覆寫GenericAPIView下的該方法,以實現自己對query_set的返回加一些邏輯
    def get_queryset(self):
        # 獲取url參數中傳過來的"要查詢的商品的價格閾值",如果沒有傳就設置為0
price_min = self.request.query_params.get("price_min", 0) return Goods.objects.filter(shop_price__gt=price_min).order_by("shop_price")

現在就可以通過在url裏指定參數price_min來實現對獲取到的商品價格的過濾了。

註意在使用這種方法時,要在router.register裏配置base_name,不然運行不了。

還可以使用django-filter,這個要把它註冊為app,然後就能用了(因為這時候不需要重寫get_queryset方法了,所以就需要把queryset這個屬性拿回來)。然後可以自定義一個filters.py用來寫自定義過濾規則的過濾器:

from django_filters import rest_framework as filters

from .models import Goods


class GoodsFilter(filters.FilterSet):
    """商品的過濾類"""
    # 區間查詢,指定區間的最大最小值
    min_price = filters.NumberFilter(field_name="shop_price", lookup_expr=gte)
    max_price = filters.NumberFilter(field_name="shop_price
", lookup_expr=lte) # 模糊查詢,這裏帶i是忽略大小寫 name = filters.CharFilter(field_name="name", lookup_expr="icontains") class Meta: model = Goods fields = [min_price, max_price, name]

然後在views.py的相關視圖類裏指定filter_class為這個自定義的過濾器類:

from .filters import GoodsFilter

class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination
    filter_backends = (DjangoFilterBackend,)
    queryset = Goods.objects.all()
    # filter_fields = (‘name‘, ‘shop_price‘)
    filter_class = GoodsFilter

在這個例子裏配置完了之後,效果就是可以在url裏指定min_price和max_price的值,來控制所返回的JSON中上shop_price值所在的區間,實現區間過濾;使用name實現模糊查詢。

DRF的兩種View層過濾方式