前言:rest framework的引擎,都是“可插拔”的,十分方便
GenericAPIView
- 支持分页、排序
- 继承
APIView
- 必须指定的类属性(继承了
APIView
的视图类,必须指定的属性)
1.queryset
:指定需要使用的查询集
2.serializer_class
:指定需要使用到的序列化器类 - 详情页视图
1.lookup_field
:查询详情数据时使用的字段名,默认为pk
2.lookup_url_kwarg
:查询详情数据时的url路径参数名词,默认和lookup_field
相同 - 支持的类方法
1.get_queryset(self)
:返回视图使用的查询集对象-
get_object(self)
:返回详情视图所需要的模型类对象、默认使用lookup_field(pk)
参数来进行过滤、如果访问的模型类对象不存在,则返回404
3.get_serializer(self, *args, **kwargs)
:返回序列化器对象
4.get_serializer_class(self)
:返回序列化器类,默认返回serializer_class
,该方法可以重写
-
- 过滤引擎(排序)
1.filter_backends
2.fiterset_fields
3.步骤
## 1.安装开源过滤引擎
# pip install django-filter
from django_filters.rest_framework import DjangoFilterBackend
from django_filters.rest_framework import DjangoFilterBackend
## 2.在视图类或全局指定过滤引擎
filter_backends = [DjangoFilterBackend]
## 3.指定需要过滤的字段
#filterset_fields = ['id']
filter_fields = ['id']
## 4.在settings.py文件中,全局指定过滤引擎
INSTALLED_APPS = [
'django_filters',
]
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS':
['django_filters.rest_framework.DjangoFilterBackend']
}
代码实践
## 1、继承GenericAPIView
class ProjectsDetail(GenericAPIView):
# 2、指定需要使用的查询集
queryset = Projects.objects.all()
# 3、指定需要使用到的序列化器类
serializer_class = ProjectModelSerializer
def get():
....
1.根据id查询projcet信息
class ProjectDetail(GenericAPIView):
queryset = Projects.objects.all()
serializer_class = ProjectModelSerializer
# 修改主键路由名称,那么定义路由urls时需要是的'<projects/<int:id>/'
lookup_field = 'id'
def get(self, request, pk): # 此处的pk,是默认的主键值,也就是定义路由urls时的'<projects/<int:pk>/'(也可以自定义字段,但是没必要)
# project = self.get_object(pk)
# GenericAPIView中实现了get_object方法,并且会自动根据传来的pk值去进行查询,并返回详情视图所需的模型类对象。
# 不需要自己自定义get_object方法,以及不需要特地传递pk值
project = self.get_object()
# 使用GenericAPIView的get_serializer方法来获取序列化器,获取到的就是上面的类属性serializer_class
serializer = self.get_serializer(instance=project)
return Response(serializer.data, status=status.HTTP_200_OK)
2.排序
GenericAPIView
有两种方式进行排序的设置
第一种:在view视图类中指定
第二种:在项目的settings.py
文件中指定
2.1、在view视图类中指定排序
1.视图类继承GenericAPIView
from rest_framework.generics import GenericAPIView
- 2.在视图类中指定所需要的过滤引擎(可多个)
- 3.指定需要排序的字段
- 4.指定查询集
- 5.指定模型序列化器
from rest_framework.filters import OrderingFilter
from rest_framework.generics import GenericAPIView
# 1.继承GenericAPIView
class ProjectsList(GenericAPIView):
# 2.在视图类中指定过滤引擎
# OrderingFilter排序过滤引擎
filter_backends = [filters.OrderingFilter]
# 3.指定需要排序的字段
ordering_fields =['name', 'leader']
# 4.指定查询集(建议不要直接通过self.queryset来获取这个类属性)
queryset =Projects.objects.all()
# 5.指定模型序列化器
serializer_class = ProjectModelSerializer
- 获取所有project信息的
get
方法可以这样修改:
def get(self, request):
# 建议调用get_queryset方法来获取查询集
project_qs = self.get_queryset()
# 对查询集进行过滤(使用的是上面类属性定义的过滤引擎),并覆盖,获取到的是经过排序后的查询集
project_qs = self.filter_queryset(project_qs)
# 建议使用get_serializer方法来获取序列化器
serializer = self.get_serializer(instance=project_qs, many=True)
# 响应返回;如果请求没有指定Accept,那么默认返回json
return Response(serializer.data, status=status.HTTP_200_OK)
- 请求:
关键字ordering
指定排序的条件(和类中指定的排序字段相同才有效),默认正序。 前面加-
则是反序
# 根据name进行正序排序
http -v :8000/projects/?ordering=name
# 反序排序
http -v :8000/projects/?ordering= -name
2.2、在项目的settings.py
文件中指定(全局排序)
需求:所有继承了GenericAPIView
的View类都使用同个排序引擎(排序字段自定义)
- 全局指定排序引擎:
这种方式设置的排序条件,可用于所有使用了该过滤器的view类 - 步骤:
1.视图类继承GenericAPIView
from rest_framework.generics import GenericAPIView
2.在项目的settings.py
文件中指定所需要的过滤引擎(可多个)
3.视图类指定需要排序的字段
4.指定查询集
5.指定模型序列化器
REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": (
"rest_framework.renderers.JSONRenderer",
"rest_framework.renderers.BrowsableAPIRenderer",
),
# 设置全局引擎
'DEFAULT_FILTER_BACKENDS': ['rest_framework.filters.OrderingFilter']
}
使用了这种方式后,其它的view类就不需要指定排序过滤引擎了
如果想要使用排序,首先继承了GenericAPIView
,然后只需要指定排序的字段即可,然后其它的代码不变
ordering_fields = ['name', 'id']
网友评论