使用开源的过滤引擎
pip install -i https//:pypi.douban.com/simple django-filter
项目setting 中注册app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'django_filters',
'projects.apps.ProjectsConfig',
'interfaces.apps.InterfacesConfig',
]
全局指定查询和排序引擎
REST_FRAMEWORK = {
# 默认响应渲染类
'DEFAULT_RENDERER_CLASSES': (
# json渲染器为第一优先级
'rest_framework.renderers.JSONRenderer',
# 可浏览的API渲染器为第二优先级
'rest_framework.renderers.BrowsableAPIRenderer',
),
'DEFAULT_FILTER_BACKENDS': ['rest_framework.filters.OrderingFilter',
'django_filters.rest_framework.backends.DjangoFilterBackend'],
# # 在全局指定分页的引擎
# # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
# 'DEFAULT_PAGINATION_CLASS': 'utils.pagination.PageNumberPaginationManual',
# # 同时必须指定每页显示的条数
# # 'PAGE_SIZE': 3,
}
from rest_framework.generics import GenericAPIView
from projects.models import Projects
from projects.serializer_m import Projects_Interfaces_Serializer, ProjectModelSerializer
from django.http import HttpResponse, JsonResponse, Http404
from rest_framework.response import Response
class ProjectsList(GenericAPIView):
#class ProjectsList(viewsets.ModelViewSet):
#filter_backends = [filters.OrderingFilter]#全局指定了 这里就只需指定过滤的字段了
ordering_fields = ['name', 'leader']
filterset_fields = ['name', 'leader', 'tester']
queryset = Projects.objects.all()#一定要指定指定的查询集
serializer_class = Projects_Interfaces_Serializer#指定用于需要查询的序列化器
def get(self,request):
project_qs = self.get_queryset()#其实就是获取上面的类属性的 queryset
project_qs = self.filter_queryset(project_qs)
serializer = self.get_serializer(instance=project_qs,many=True)
return Response(serializer.data)
def post(self,request):
serializer = ProjectModelSerializer(data=request.data)
try:
serializer.is_valid(raise_exception=True)
except:
return JsonResponse(serializer.errors)
serializer.save()
return Response(serializer.data,status=201)
class ProjectDetails(GenericAPIView):
queryset = Projects.objects.all()
serializer_class = Projects_Interfaces_Serializer
def get(self,request,pk):
project_qs = self.get_object()
serializer = Projects_Interfaces_Serializer(instance=project_qs)
return Response(serializer.data)
def put(self,request,pk):
project_ps = self.get_object()
serializer = ProjectModelSerializer(instance=project_ps,data=request.data)
try:
serializer.is_valid(raise_exception=True)
except:
return JsonResponse(serializer.errors)
serializer.save()
return Response(serializer.data,status=201)
def delete(self,request,pk):
project_ps = self.get_object()
project_ps.delete()
return Response({"message":"项目{}删除成功".format(pk)},status=204)
演示过滤效果
演示排序:
倒序 根据unicode编码排序: