一、简介
上一期把接口自动化测试平台的登录给完成了。因为接口和用例都是挂在项目之下,所以本次要在后端实现增删改查的接口。
二、注册模型
# 项目管理
class Project(models.Model):
'''
项目表
'''
ProjectType = (
('web', 'web'),
('app', 'app')
)
project_name = models.CharField(verbose_name='项目名称', max_length=30)
type = models.CharField(max_length=50, verbose_name='项目类型', choices=ProjectType)
project_description = models.CharField(verbose_name='项目描述', max_length=100)
# create_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user', verbose_name='创建人')
created_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
# 创建时间
modified_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
除了自定义的5个字段外,还会自动新增一个自增id作为主键。
序列化器
class ProjectSerializer(serializers.ModelSerializer):
# 设置创建时间和更新时间格式化
created_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
modified_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
# create_user = UserSerializer(read_only=True)
# 正向嵌套
class Meta:
model = Project
fields = '__all__' # 默认序列化全部
三、视图编写
视图大概有两种,分为列表视图和详情视图。详情视图需要传入对应的id,如果没有那么查询全部。所有请求都需要经过接口鉴权才可以使用,否则会报令牌无效。
使用类视图编写如下,直接上代码:
from rest_framework import status
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from sweet.models import Project
from sweet.serializers import ProjectSerializer
from django.http import JsonResponse
class ProjectView(APIView):
'''REST framework的APIView实现获取crud列表'''
authentication_classes = (TokenAuthentication,) # token认证
permission_classes = (IsAuthenticated,) # IsAuthenticated 仅通过认证的用户
def get(self, request, pk, format=None):
"""
Return a list of all project
"""
if pk:
try:
art = Project.objects.get(id=pk)
serializer = ProjectSerializer(art, many=False)
return JsonResponse(serializer.data, safe=False, status=status.HTTP_200_OK)
except Project.DoesNotExist:
return JsonResponse({'message: 查询的数据不存在'}, status=404)
else:
art = Project.objects.all()
serializer = ProjectSerializer(art, many=True)
return JsonResponse(serializer.data, safe=False, status=status.HTTP_200_OK)
def post(self, request, format=None):
"""
create project Info
"""
verify_data = ProjectSerializer(data=request.data)
if verify_data.is_valid():
verify_data.save()
return JsonResponse({"message": "create some data!", "data": request.data})
else:
return JsonResponse(verify_data.errors)
def put(self, request, pk):
"""
modify info of project
"""
project = Project.objects.get(pk=pk)
project.project_name = request.data.get("project_name")
project.type = request.data.get("type")
project.project_description = request.data.get("project_descriptipon")
project.save()
serializer = ProjectSerializer(Project.objects.get(pk=pk), many=False)
return JsonResponse(serializer.data, safe=False)
def delete(self, request, pk):
"""
delte the single project
"""
Project.objects.get(pk=pk).delete()
四、路由映射
re_path('api/v1/project/(?P<pk>\d+)/', views.ProjectView.as_view(), name="project"),
因为使用的是类视图,有的请求需要传id,有的又不用。故采用正则表达式的路由匹配。
同时as_view()会根据用户发起的请求方法自动分发。
五、使用工具检查
启动项目:python3 manage.py runserver 0.0.0.0:7081
使用ApiPost验证结果如下:
其他的请求,增加(post)、修改(put)、删除(delete)只需要修改请求方法,路径不变即可。