RestFrameworkのフィルタコンポーネントとページングコンポーネント

8194 ワード

クラスタインタフェース各種フィルタコンポーネントデータ準備
models.py
class Car(models.Model):
    name = models.CharField(max_length=16, unique=True, verbose_name='  ')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='  ')
    brand = models.CharField(max_length=16, verbose_name='  ')

    class Meta:
        db_table = 'api_car'
        verbose_name = '   '
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

 
admin.py
admin.site.register(models.Car)

serializers.py
class CarModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Car
        fields = ['name', 'price', 'brand']

 
views.py
# Car     
from rest_framework.generics import ListAPIView

class CarListAPIView(ListAPIView):
    queryset = models.Car.objects.all()
    serializer_class = serializers.CarModelSerializer

urls.py
url(r'^cars/$', views.CarListAPIView.as_view()),

 
 
drf検索フィルタコンポーネント
views.py
from rest_framework.generics import ListAPIView

#    :drf SearchFilter -     
from rest_framework.filters import SearchFilter

class CarListAPIView(ListAPIView):
    queryset = models.Car.objects.all()
    serializer_class = serializers.CarModelSerializer

    #    :          (     DEFAULT_FILTER_BACKENDS)
    filter_backends = [SearchFilter]

    #    :SearchFilter           =>   :/cars/?search=...
    search_fields = ['name', 'price']
    # eg:/cars/?search=1,name price   1         

 
 
drfソートフィルタコンポーネント
views.py
from rest_framework.generics import ListAPIView

#    :drf OrderingFilter -     
from rest_framework.filters import OrderingFilter

class CarListAPIView(ListAPIView):
    queryset = models.Car.objects.all()
    serializer_class = serializers.CarModelSerializer

    #    :          (     DEFAULT_FILTER_BACKENDS)
    filter_backends = [OrderingFilter]

    #    :OrderingFilter           =>   :/cars/?ordering=...
    ordering_fields = ['pk', 'price']
    # eg:/cars/?ordering=-price,pk,  price  ,    price  ,  pk  

 
 
drfベースページングコンポーネント
pagenations.py
from rest_framework.pagination import PageNumberPagination

class MyPageNumberPagination(PageNumberPagination):
    # ?page=  
    page_query_param = 'page'
    # ?page=             
    page_size = 3
    # ?page=  &page_size=               
    page_size_query_param = 'page_size'
    #                 :    5    5 
    max_page_size = 5

 
 
views.py
from rest_framework.generics import ListAPIView

class CarListAPIView(ListAPIView):
    #   queryset      ,    .all(),        
    queryset = models.Car.objects.all()
    serializer_class = serializers.CarModelSerializer
    
    #      -             -         ,  drf        
    pagination_class = pagenations.MyPageNumberPagination