关于DRF的入门学习①

序列化器:

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, 程序报错了

感叹:

突然感叹学习的时候还是要写一些博客, 这样可以整理我的思绪, 相当于一次强有力的复习.而且方便日后查看, 真的方便

今天也是充实的一天啊 ! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值