一、基本视图集ViewSet
基于视图集和路由实现API接口
前面的接口在实现的过程中,也存在了代码重复的情况,我们如果合并成一个接口类,则需要考虑2个问题:
1.路由的合并问题
2.get方法重复问题
drf提供了视图集可以解决以上问题
from rest_framework.viewsets import ViewSet
代码:
views.py
from rest_framework.viewsets import ViewSet
class StudentViewSet(ViewSet):
def get_student_list(self, request):
"""获取所有学生信息"""
# 1.从数据库中读取学生信息
student_list = Students.objects.all()
# 2.实例化序列化器,获取序列化器对象
serializer = StudentModelSerializer(instance=student_list, many=True)
# 3.转换数据并返回给客户端
return Response(serializer.data, status=status.HTTP_200_OK)
def post_student_info(self, request):
"""添加一条学生信息"""
# 1.获取客户端提交的数据,实例化序列化器,获取实例化对象
serializer = StudentModelSerializer(data=request.data)
# 2.反序列化(数据验证,保存到数据库)
serializer.is_valid(raise_exception=True)
serializer.save()
# 3.返回新增的模型数据给客户端
return Response(serializer.data, status=status.HTTP_201_CREATED)
def get_student_info(self, request, pk):
"""获取一条数据"""
# 1.根据pk值获取一条数据
try:
student = Students.objects.get(pk=pk)
except Students.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
# 2.实例化序列化器对象
serializer = StudentModelSerializer(instance=student)
# 3.转换数据,并返回给客户端
return Response(serializer.data, status=status.HTTP_200_OK)
def put_student_info(self, request, pk):
"""更新一条数据"""
try:
student = Students.objects.get(pk=pk)
except Students.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
# 实例化序列化对象,获取客户端传入的数据
serializer = StudentModelSerializer(instance=student, data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
def delete_student_info(self, request, pk):
"""删除一条数据"""
try:
Students.objects.get(pk=pk).delete()
except Students.DoesNotExist:
pass
return Response(status=status.HTTP_204_NO_CONTENT)
urls.py
# 视图集
re_path('^students5/(?P<pk>\d+)/$', views.StudentViewSet.as_view({
"get": "get_student_info",
"put": "put_student_info",
"delete": "delete_student_info",
})),
path('students5/', views.StudentViewSet.as_view({
"get": "get_student_list",
"post": "post_student_info",
})),
二、通用视图集GenericViewSet
views.py
"通用视图集GenericViewSet"
from rest_framework.viewsets import GenericViewSet
class StudentGenericViewSet(GenericViewSet):
queryset = Students.objects.all()
serializer_class = StudentModelSerializer
def get_student_list(self, request):
"""获取所有学生信息"""
# 1.从数据库中读取信息
queryset = self.queryset
# 2.序列化
serializer = self.get_serializer(instance=queryset, many=True)
return Response(serializer.data)
def post_student_info(self, request):
"""添加一个数据"""
# 1.获取客户端传来的数据,实例化序列化器,获取实例化对象
serializer = self.get_serializer(data=request.data)
# 2.反序列化
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
def get_student_info(self, request, pk):
"""获取一个数据"""
# 1.通过pk值获取对应数据
instance = self.get_object()
# 2.序列化
serializer = self.get_serializer(instance=instance)
return Response(serializer.data)
def put_student_info(self, request, pk):
"""更新一条数据"""
instance = self.get_object()
serializer = self.get_serializer(instance=instance, data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
def delete_student_info(self, request, pk):
"""删除一条数据"""
self.get_object().delete()
return Response(status=status.HTTP_204_NO_CONTENT)
urls.py
# 通用视图集
re_path('^students6/(?P<pk>\d+)/$', views.StudentGenericViewSet.as_view({
"get": "get_student_info",
"put": "put_student_info",
"delete": "delete_student_info",})),
path('students6/', views.StudentGenericViewSet.as_view({
"get": "get_student_list",
"post": "post_student_info",})),
三、通用视图集 + 混入类
class StudentMixinViewSet(GenericViewSet, ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin,
DestroyModelMixin):
queryset = Students.objects.all()
serializer_class = StudentModelSerializer
最终版!五个合成一个ModelViewSet
from rest_framework.viewsets import ModelViewSet
class StudentModelViewSet(ModelViewSet):
queryset = Students.objects.all()
serializer_class = StudentModelSerializer
"""
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""