Django 는 drf 검색 필터 와 정렬 필 터 를 실현 합 니 다.

5478 단어 djangodrf여과
머리말
백 엔 드 의 데 이 터 를 필터 해 야 할 때drf는 두 가지 가 있 습 니 다.필터 와 정렬 필 터 를 검색 합 니 다.
검색 필터:예 를 들 어 우리 가 되 돌아 가 고 싶 은 것sex=1은 모든 데이터 에서 선별 할 수 있 습 니 다.
정렬 필터:예 를 들 어 우리 가 가격 을 오름차 순 으로 배열 하려 면 정렬 필 터 를 사용 할 수 있 습 니 다.
검색 필터
실제 사용 과정 에서 매우 간단 합 니 다.보기 류 에 전역 변수filter_backends를 설정 한 다음search_fields에서 어떤 필드 를 통 해 선별 해 야 하 는 지 확인 하 십시오.

from rest_framework.filters import SearchFilter
class CarView(ListAPIView):
    serializer_class = CarSerializer
    queryset = Car.objects.all()
    #            
    filter_backends = [SearchFilter]
    # SearchFilter          
    search_fields = ['name']
그 후에 우리 가url주 소 를 방문 할 때url뒤에?search=" 1 "추가 할 수 있다.그러면 우 리 는name='BMW 1 학과'의 데 이 터 를 걸 러 낼 것 이다.

정렬 필터
검색 필터 와 마찬가지 로 부분 변수filter_backends를 설정 한 다음 설정ordering_fields을 통 해 어떤 필드 를 통 해 정렬 할 지 확인 합 니 다.

from rest_framework.filters import SearchFilter, OrderingFilter
class CarView(ListAPIView):
    serializer_class = CarSerializer
    queryset = Car.objects.all()
    #            
    filter_backends = [SearchFilter, OrderingFilter]
    # SearchFilter          
    search_fields = ['name']
    #        
    ordering_fields = ['price']
그 후에 우 리 는url주 소 를 방문 할 때url뒤에?search=" "&ordering="price"를 추가 할 수 있다.그러면 우 리 는 모든 BMW 시리즈 의 차 를 걸 러 내 고 데이터 의 순 서 는 차 의 가격 에 따라 낮은 것 에서 높 은 것 으로 정렬 할 것 이다.

PS:필터 기능 은 제3자 패키지 django 를 이용 합 니 다.filers,검색 과 정렬 은 Django DRF 가 제공 하 는 filter 를 이용 합 니 다.

from rest_framework import filters #         #   :     DRF      

from django_filters.rest_framework import DjangoFilterBackend  # DjangoFilterBackend    (  )  ,                  
import django_filters

class GoodsFilter(django_filters.rest_framework.FilterSet):
    """      """
    min_price = django_filters.NumberFilter(field_name="price",
                                            lookup_expr="gte")  # field_name        ;lookup_expr             ,gte        
    max_price = django_filters.NumberFilter(field_name="price", lookup_expr="lte")  # lte     
    name = django_filters.CharFilter(field_name="name",lookup_expr="icontains")  # icontains      (     )

    class Meta:
        model = models.Goods  #     
        fields = ["min_price","max_price","name"]  #      


class GoodsPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = "page_size"
    page_query_param = "p"
    max_page_size = 100

class GoodsListViewSet(mixins.ListModelMixin,GenericViewSet):
    """    """
    queryset = models.Goods.objects.all() #   get_queryset()        ,         queryset;  get_queryset    ,        ,       get_queryset()    queryset
    pagination_class = GoodsPagination
    
    #    :       (          )
    filter_backends = (DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter)  # filters.SearchFilter        ;filters.OrderingFilter        
    filterset_class = GoodsFilter  #          GoodsFilter     filterset_class
    search_fields = ('^name', 'goods_brief')  #           # '^' Starts-with search;'=' Exact matches.
    ordering_fields = ("sold_num","add_time") #           
    
    #       ...
    
    """
    #        
    filter_backends = (DjangoFilterBackend,) #     
    filterset_fields = ("name","shop_price")  #       #              
    """
    
    """
    #    :get_queryset()  
    def get_queryset(self):  #     ; GenericAPIView      
        queryset = models.Goods.objects.all()
        price_min = self.request.query_params.get("price_min",0)
        if price_min:
            queryset = queryset.filter(shop_price_gt=int(price_min))
        return queryset
    """
    
    """
       :   django-filter
    # 1. pip install django-filter
    # 2.   "django-filters"     Django   INSTALLED_APPS  
    # 3.   filter_backends     DjangoFilterBackend,  filterset_fields         
                ,                               ;
              (          ),      
    """
    
    """
       :   django-filter         
    1.         
    2. filter_backends = (DjangoFilterBackend,)
    3. filterset_class = GoodsFilter  #          GoodsFilter     filterset_class
    """
Django 가 drf 검색 필터 와 정렬 필 터 를 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 drf 검색 필터 와 정렬 필터 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기