1、views.View与原生的区别:
创建了as_view方法使得路由能够根据方法名识别请求类型。如:get请求不在url中传pk参数时,调用获取列表的方法,传入pk参数时,调用获取详情方法
2、视图中引入类
由于获取列表与获取详情都是调用get方法,一个类中不能存在两个相同的方法名,所以根据参数pk是否传入分为两类:列表、详情 列表中:获取列表、添加,方法分别为:get、post 详情中:获取详情、更新、删除,方法分别为:get、put、delete
3、url的变动
由于python3的path不支持参数匹配,所以使用re_path匹配路由 列表路由:re_path('getlist/$', views.StudentListView.as_view())
'getlist/$':路由匹配规则,访问url:.../getlist/ views.StudentListView.as_view():指定该路由的方法类的位置 详情路由:re_path('getlist/$', views.StudentListView.as_view())
'getlist/(?P<pk>\d+)/$':路由匹配规则,访问url:.../getlist/{id}/ views.StudentListView.as_view():指定该路由的方法类的位置
4、实践:
from django.db import models
class StudentInfo(models.Model):
name = models.CharField(max_length=200)
age = models.IntegerField()
sex = models.IntegerField()
classes = models.CharField(max_length=200)
from django.urls import path, re_path
from . import views
urlpatterns = [
re_path('getlist/$', views.StudentListView.as_view()),
re_path('getlist/(?P<pk>\d+)/$', views.StudentDetailView.as_view()),
]
import json
from django import views
from django.http import JsonResponse, HttpResponse
from drf.models import StudentInfo
class StudentListView(views.View):
"""列表视图,获取数据"""
def get(self, request):
# 指定查询集, 类型为:<QuerySet> 列表
queryset = StudentInfo.objects.all()
# 将查询出的数据转化为JSON数据并存入data列表,返回给前端
data = []
for stu in queryset:
data.append({
'id': stu.id,
'name': stu.name,
'age': stu.age,
'sex': stu.sex,
'classes': stu.classes
})
return JsonResponse(data, safe=False)
def post(self, request):
"""列表视图,添加"""
# 获取前端请求体中的数据,转为字典
request_dict = json.loads(json.dumps(request.POST))
"""
此处需要对请求参数request_dict进行判断,
"""
# 将请求数据存入数据库
# **request_dict: 将{'a': 'b'}转为 a=b
student = StudentInfo.objects.create(**request_dict)
# data为返回给前端的数据,类型: JSON
data = {'id': student.id,
'name': student.name,
'age': student.age,
'sex': student.sex,
'classes': student.classes}
return JsonResponse(data)
class StudentDetailView(views.View):
"""详情视图,获取详情"""
def get(self, request, pk):
# 判断前端传的id是否存在,否则返回404
try:
queryset = StudentInfo.objects.get(id=pk)
except StudentInfo.DoesNotExist:
return HttpResponse(status=404)
# 将查询出的数据转为JSON传给前端
data = {'id': queryset.id,
'name': queryset.name,
'age': queryset.age,
'sex': queryset.sex,
'classes': queryset.classes}
return JsonResponse(data)
def put(self, request, pk):
# 判断前端传的id是否存在,否则返回404
try:
queryset = StudentInfo.objects.get(id=pk)
except StudentInfo.DoesNotExist:
return HttpResponse(status=404)
# 获取前端请求体中的数据,转为字典
request_dict = json.loads(json.dumps(request.GET))
"""
此处需要对请求参数request_dict进行判断,得出哪些字段需要被更新
"""
queryset.name = request_dict['name']
queryset.save()
# 将查询出的数据转为JSON传给前端
data = {'id': queryset.id,
'name': queryset.name,
'age': queryset.age,
'sex': queryset.sex,
'classes': queryset.classes}
return JsonResponse(data)
def delete(self, request, pk):
# 判断前端传的id是否存在,否则返回404
try:
queryset = StudentInfo.objects.get(id=pk)
except StudentInfo.DoesNotExist:
return HttpResponse(status=404)
# 删除
queryset.delete()
return HttpResponse(status=204)
5、结果: