序列化器:
class StudentSerializer(serializers.Serializer):
# 这里的序列化器,注释掉哪一行,就会让哪一行的数据不返回,控制非常方便
# 这里的"name\sex\age"等一定要和数据库里的属性名一模一样,否则返回报错,非要想改名的话,可在后面括号source="name",
# 举例:names = serializers.CharField(source="name"),这样处理后,post的返回会是:names:小明
name = serializers.CharField()
sex = serializers.BooleanField()
age = serializers.IntegerField()
class_null = serializers.CharField()
关于url的CRUD逻辑
instance= 是用于将本地转为json发出去
data= 是用于将json转为本地存进来
1-先说get的查看所有资源吧:
def get(self,request):
# 这里是取出来的queryset,放着一个个的student对象
# [student,student,student,...]
student = Student.objects.all()
# 再将取出来的 [student,student,student,...](queryset)
# 转换为[{:},{:},{:}]
# 解释many:因为student是一个queryset,是含有多个数据的,转换成json的时候是一个列表套字典的格式,如果many=false,那么会转换成一个字典
serializer = StudentSerializer(instance=student,many=True)
# 这个data就是去拿序列化后的一个结果
return Response(serializer.data)
2-再来是post是在数据库中添加一个post请求的数据,并返回你添加了啥
def post(self,request):
print(request.data , type(request.data))
# 反序列化
serializer = StudentSerializer(data=request.data)
# 校验(is_valid是校验)
if serializer.is_valid():
# print("validated_data:",serializer.validated_data)
# 注意注意,这里很关键,要**+.validate_data才是有效create
stu = Student.objects.create(**serializer.validated_data)
# 再将添加好的东西序列化成json返还回去
bac = StudentSerializer(instance=stu)
# 注意bac.data才是json的内容
return Response(bac.data)
else:
return Response(serializer.errors)
再来是请求单个数据(get):
先看看url中,这次使用了一个新的import:re_path, repath和普通的区别就是可以使用正则表达式,来进行传参, 这里的参数传到了get的id里
url:
from django.contrib import admin
from django.urls import path,re_path
# from user import views
from drfdemo import views
urlpatterns = [
path('admin/', admin.site.urls),
# path('login/', views.LoginView.as_view()),
path('student/', views.StudentView.as_view()),
re_path('student/(\d+)/', views.studentDetailView.as_view()),
]
view:
class studentDetailView(APIView):
def get(self,reqeust,id):
# !!这里的pk就是primary key,就是指主键!!
student = Student.objects.get(pk = id)
serializer = StudentSerializer(instance=student, many=False)
return Response(serializer.data)
pk就是primary key ,就是主键, 在这个情况下就是id, 可以换成id也一样运行成功(我试过了)
3-之后是单个的删除
def delete(self, reqeust,id):
Student.objects.get(pk = id).delete()
return Response()
删除就比较简单, 但是这里有个get要注意一下, .get表示选中单个的数据,而.filter表示选择一堆数据
4-最后是数据的修改(更新\替换)
敲黑板, 很重要, 我多练两遍
def put(self,request,id):
serializer = StudentSerializer(data=request.data)
if serializer.is_valid():
Student.objects.filter(pk = id).update(**serializer.validated_data)
bac = Student.objects.get(pk = id)
ser = StudentSerializer(instance=bac , many=False)
return Response(ser.data)
pass
过程描述:
1-先将客户端的post请求通过StudentSerializer序列化成serializer
2-判断序列化是否成功(is_valid())
3-将序列化成功后的serializer(post内容), 根据id ,update到服务端数据库内替换
4-在数据库中使用get提取到刚刚替换的内容, 并存放到bac内
5-将bac(刚刚提取到的queryset)通过StudentSerializer(方法类)转化为json再传回客户端
总结: 所以通过什么样的字典(数据)(queryset)创建什么样的 序列化器(如StudentSerializer)(大写), 再通过 序列化器完成数据转换(queryset--json)
def put(self,request,id):
ser = StudentSerializer(data=request.data)
if ser.is_valid():
Student.objects.filter(id = id).update(**ser.validated_data)
cha = Student.objects.get(id = id)
sav = StudentSerializer(instance=cha)
return Response(sav.data)
刚刚默写了一遍, 成功了, 开心, 嘿嘿
问题序列:
1\get\filter 2many的默认值
刚刚尝试过了get和filter不能互换,我将filter换成了get, 报错了,我又将get换成filter也报错了, 难蚌
刚刚尝试过了单个文件的修改状况下(上述案例4)没加many值也修改成功了
刚刚尝试了在修改单个文件的情况下加了,many=True, 程序报错了
感叹:
突然感叹学习的时候还是要写一些博客, 这样可以整理我的思绪, 相当于一次强有力的复习.而且方便日后查看, 真的方便
今天也是充实的一天啊 !