过滤和排序

过滤组件

对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-filter扩展来增强支持

pip install django-filter

在配置文件中添加过滤后端的设置

INSTALLED_APPS=[
    'django_filter',#需要注册应用
]

#全局配置,也可以局部配置
REST_FRAMEWORK = {
	'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
}


在视图类中添加 filterset_fields类属性,指定可以过滤的字段

from rest_framework.generics import ListAPIView
from app01.models import Book
from django_filters.rest_framework import DjangoFilterBackend

class BookView(ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [DjangoFilterBackend]  # 在视图中加上该类,就可以
    filterset_fields = ('name','price')   #配置按照哪个字段来过滤
    
    
#http://127.0.0.1:8000/books/?price=40
#http://127.0.0.1:8000/books/?name=活着

排序组件

在类视图中设置filter_backends 属性,使用rest_framework.filters.OrderingFilter过滤器,DRF会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数指明的排序字段对数据集进行排序后展示。

from rest_framework.generics import ListAPIView
from rest_framework.filters import OrderingFilter
from app01.models import Book
from app01.serializer import BookSerializer


# # 排序组件使用
class Book2View(ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [OrderingFilter]  
    ordering_fields = ('id' ,'price',) # # 指明按照'id'和'price'字段的值的大小对数据进行排序后展示
    
    
#urls.py
path('books2/', views.Book2View.as_view()),

#必须是ordering = 某个值
#http://127.0.0.1:8000/books2/?ordering=price
# 127.0.0.1:8000/books2/?ordering=-id
# -id 表示针对id字段进行倒序排序
# id  表示针对id字段进行升序排序

image-20221210105958743

根据id降序排序

image-20221210110027126

如果需要过滤后在排序,则选哟过滤和排序两者结合使用

from rest_framework.generics import ListAPIView
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from app01.models import Book
from app01.serializer import BookSerializer

#views.py
class Book3View(ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # 因为'filter_backends'是局部过滤配置,局部配置会覆盖'settinigs.py'文件中的全局配置,所以需要再次声明过滤组件核心类'DjangoFilterBackend',否则过滤功能会失效
    filter_backends = [DjangoFilterBackend, OrderingFilter]  # 在视图中加上该类,就可以
    filterset_fields = ('name', 'price')
    ordering_fields = ('id', 'price',)
    
    
#urls.py
path('books3/', views.Book3View.as_view()),


#http://127.0.0.1:8000/books3/?price=66&ordering=-id
#先过滤出价格为66的,再根据id字段降序排序

image-20221210111252689

posted @ 2022-12-12 17:30  ExpiredSaury  阅读(51)  评论(0编辑  收藏  举报