與DRF集成自定義fliter

主要目的:使用filter完成條件查詢

1. 使用FilterSet

  1. 執行pip install django_filter命令
  2. 導入
from django_filters import rest_framework as filters
  1. 使用FilterSet
  2. 將其添加到filterset_class視圖類的參數中
  3. 使用新的FilterSet時,僅需要更改導入路徑
  4. 如果要默認使用django-filter後端,請將其添加到DEFAULT_FILTER_BACKENDS設置中。
# settings.py
INSTALLED_APPS = [
    ...
    'rest_framework',
    'django_filters',
]

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
        ...
    ),
}

實現代碼

from rest_framework import generics
from django_filters import rest_framework as filters
from myapp import Product


class ProductFilter(filters.FilterSet):
    min_price = filters.NumberFilter(field_name="price", lookup_expr='gte')
    max_price = filters.NumberFilter(field_name="price", lookup_expr='lte')

    class Meta:
        model = Product
        fields = ['category', 'in_stock', 'min_price', 'max_price']


class ProductList(generics.ListAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filter_backends = [filters.DjangoFilterBackend,]
    filterset_class = ProductFilter

2. 使用 filterset_fields

filterset_fieldsFilterSet不可同時使用

實例代碼

from rest_framework import generics
from django_filters import rest_framework as filters


class ProductList(generics.ListAPIView):
    queryset = Product.objects.all()
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_fields = ('category', 'in_stock')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章