过滤和排序
过滤组件
对于列表数据可能需要根据字段进行过滤,我们可以通过添加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字段进行升序排序
根据id
降序排序
如果需要过滤后在排序,则选哟过滤和排序两者结合使用
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字段降序排序
本文来自博客园,作者:ExpiredSaury,转载请注明原文链接:https://www.cnblogs.com/saury/p/16976711.html