学到这里,我们了解了Django的基本使用和数据的操作,下面是我针对接口数据的增删改查需求使用2种不同的写法:
写法一:
子应用路由表 urls.py
urlpatterns = [
# path('admin/', admin.site.urls),
path('index1/', index1),
path('index1/', views.index1),
re_path('^index2/$', index2),
#类视图路由的定义,views.类视图.as_view(),as_view必须要加括号,不然后面运行会有报错
path('index4/',views.MyView.as_view()),
# 冒号前面:内置转化器(int、slug、uuid等)
# 冒号后面:路径参数名
path('index4/<int:pk>/',views.MyView.as_view())
]
模型类 models.py
class ProjectsModel(BaseModel):
# 设置id为主键
id = models.AutoField(primary_key=True, verbose_name="id主键", help_text="id主键")
name=models.CharField(unique=True,max_length=200,verbose_name="项目名",help_text="项目名")
leader=models.CharField(max_length=20,verbose_name="负责人",help_text="负责人")
tester=models.CharField(max_length=20,verbose_name="测试负责人",help_text="测试负责人")
programmer=models.CharField(max_length=50,verbose_name="开发人员",help_text="开发人员")
publish_app=models.CharField(max_length=100,verbose_name="发布应用",help_text="发布应用")
desc=models.TextField(max_length=200,verbose_name="简要描述",help_text="简要描述",blank=True,null=True,default="")
class Meta:
db_table = 'tb_projects'
verbose_name = '项目信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
视图集 views.py
在设计接口时候,根据数据的增删改查不同的操作映射不同的请求方式:
新增数据------->post请求,入参为json格式数据
删除数据------->delete请求,入参为项目id
修改数据------->put请求,可以传id和要更新的属性值
查询所有数据------->get请求
查询指定id的数据------->get请求
class MyView(View):
def get(self, request, pk=None):
# 查询数据
# data=ProjectsModel.objects.get(id=1)
if pk != None:
data_query = ProjectsModel.objects.get(pk=pk)
# data_query=dict(data_query)
data_list = []
data_dic = {
"id": data_query.id,
"project_name": data_query.name,
"tester": data_query.tester,
"leader": data_query.leader,
"publish_app": data_query.publish_app
}
data_list.append(data_dic)
data_str = json.dumps(data_list, ensure_ascii=False)
return HttpResponse(data_str, content_type="application/json")
else:
data_query = ProjectsModel.objects.all()
data_list = []
for obj in data_query:
data_dic = {
"id": obj.id,
"name": obj.name,
"tester": obj.tester
}
data_list.append(data_dic)
# data_query=list(data_query)
data_str = json.dumps(data_list, ensure_ascii=False)
return HttpResponse(data_str, content_type="application/json")
# data=ProjectsModel.objects.filter(id__gte=2)
# return JsonResponse(data_query, safe=False)
# data_qs=ProjectsModel.objects.filter(name__contains="项目").exclude(desc__startswith="1没有")
# data_qs=ProjectsModel.objects.filter(Q(name__contains="项目")|Q(desc__startswith="1没有"))
# data_qs=ProjectsModel.objects.filter(interfacesmodel__tester="测试人1")
# data_qs=ProjectsModel.objects.filter(interfacesmodel__tester__endswith="1")
# data_qs = InterfacesModel.objects.filter(project__name__contains="项目")
# data_list = []
# for obj in data_qs:
# data_dic = {
# "id": obj.id,
# "name": obj.name,
# "tester": obj.tester
# }
# data_list.append(data_dic)
# return JsonResponse(data_list, safe=False)
def post(self, request):
# 视图函数和类视图中的请求方法,一定要返回HttpResponse对象或者子类对象
# a.第一个参数为content,需要传递响应数据(类型为字符串或者字节类型)
# b.可以使用content_type关键字参数来指定响应报文类型(text/html、application/json等等)
# c.可以使用status关键字参数来指定响应状态码
# 创建数据
# 方法一:
# data=ProjectsModel(name="是个名字a a ",leader="测试leader",tester="测试人",programmer="五星开发",publish_app="发布应用",desc="没有描述信息")
# data.save()
# 方法二:
# data=ProjectsModel.objects.create(name="是个名字a a ",leader="测试leader",tester="测试人",programmer="五星开发",publish_app="发布应用",desc="没有描述信息")
body_byte_data = request.body.decode()
body_str_data = json.dumps(body_byte_data, ensure_ascii=False)
data_dic = eval(json.loads(body_str_data))
create_data = ProjectsModel.objects.create(**data_dic)
return HttpResponse(create_data, content_type="application/json", status=200)
def put(self, request, pk):
# 场景一:
# 通过id搜索出来对应的数据,并修改指定id的数据
query_data = ProjectsModel.objects.get(pk=pk)
# # 读取输入的json数据转化为dic类型
body_byte_data = request.body.decode()
body_str_data = json.dumps(body_byte_data, ensure_ascii=False)
data_dic = eval(json.loads(body_str_data))
# # 更新对应的字段
query_data.name = data_dic["name"]
query_data.leader = data_dic["leader"]
query_data.tester = data_dic["tester"]
query_data.programmer = data_dic["programmer"]
query_data.publish_app = data_dic["publish_app"]
query_data.desc = data_dic["desc"]
query_data.save()
return HttpResponse("PUT请求,修改数据成功")
# 场景二:
# query_data = ProjectsModel.objects.filter(id=pk).update(leader="hahahha")
# update_data={
# "name":query_data.name
# }
# return HttpResponse("PUT请求,update修改数据成功")
def delete(self, request, pk):
dele_data = ProjectsModel.objects.get(pk=pk)
dele_data.delete()
return HttpResponse("DELETE删除成功")
使用postman进行调试
查询所有数据:
查询指定数据
创建数据
修改数据
删除数据:
这个方法主要特点是:
- 共用一个视图类
- 全量查询和部分查询结合在一起
如果后面需要根据接口新增功能逻辑时候,兼顾到接口请求的兼容性就越来越困难,维护起来也不方便。
写法二:(推荐)
项目路由表:
这里我们改造了下路由路径:
需要传递pk的,我们就指定去类名为ProjectsDetailViews里去找,比如删除、修改、根据pk值查找;
不需要传递pk的,我们就指定去类名为ProjectsViews里去找,比如新增数据、全量查询。
urlpatterns = [
path('projects/',views.ProjectsViews.as_view()),
path('projects/<int:pk>/',views.ProjectsDetailViews.as_view())
]
项目视图集文件:
class ProjectsDetailViews(View):
# 查询指定pk的数据
def get(self, request, pk):
ret = {
"msg": "传参异常",
"code": 404
}
try:
query_data = ProjectsModel.objects.get(pk=pk)
# 如果入参是不存在的id数据,抛出异常
except Exception:
return JsonResponse(ret, json_dumps_params={"ensure_ascii": False}, status=404)
data_dict = {
"id": query_data.id,
"name": query_data.name,
"leader": query_data.leader
}
return JsonResponse(data_dict, json_dumps_params={"ensure_ascii": False}, status=200)
# 更新数据
def put(self, request, pk):
ret = {
"msg": "传参异常",
"code": 404
}
try:
#查出对应id的数据
query_data=ProjectsModel.objects.get(pk=pk)
#提取传入的参数
data_str=request.body.decode('utf-8')
data_dict=json.loads(data_str)
#修改老数据,传入新数据给对应字段
query_data.name=data_dict["name"]
query_data.leader=data_dict["leader"]
query_data.desc=data_dict["desc"]
except Exception:
return JsonResponse(ret, json_dumps_params={"ensure_ascii": False}, status=200)
#保存更新的数据
query_data.save()
#输出战展示数据
data_dict = {
"id": query_data.id,
"name": query_data.name,
"leader": query_data.leader
}
return JsonResponse(data_dict,json_dumps_params={"ensure_ascii":False},status=200)
# 删除数据
def delete(self, request, pk):
ret={
"msg":"删除成功!"
}
ret_error = {
"msg": "传参异常",
"code": 404
}
try:
# 根据id查出对应数据
query_data = ProjectsModel.objects.get(pk=pk)
#删除指定数据
query_data.delete()
#一般删除数据的输出为None
except Exception:
return JsonResponse(ret_error,json_dumps_params={"ensure_ascii":False},status=200)
return JsonResponse(ret,json_dumps_params={"ensure_ascii":False},status=200)
class ProjectsViews(View):
# 查询全部数据
def get(self, request):
pro_data=ProjectsModel.objects.all()
pro_list=[]
for pro in pro_data:
pro_dict={
"id": pro.id,
"name": pro.name,
"leader": pro.leader
}
pro_list.append(pro_dict)
return JsonResponse(pro_list,safe=False, json_dumps_params={"ensure_ascii": False}, status=200)
# 创建数据
def post(self, request):
ret = {
"msg": "传参异常",
"code": 404
}
try:
json_str = request.body.decode('utf-8')
data_dict=json.loads(json_str)
#如果入参不是json格式数据,抛出异常
except json.JSONDecodeError:
return JsonResponse(ret,json_dumps_params={"ensure_ascii": False}, status=404)
create_data=ProjectsModel.objects.create(**data_dict)
create_data.save()
pro_dict = {
"id": create_data.id,
"name": create_data.name,
"leader": create_data.leader
}
return JsonResponse(pro_dict,json_dumps_params={"ensure_ascii": False}, status=200)