zoukankan      html  css  js  c++  java
  • ModelSerializer序列化(Apiview)

    url部分:
    url(r'^book/$',views.book.as_view()),
    url(r'^books/(d+)/$', views.bookdetail.as_view(),name='book_detail'),
    #url(r'^books/(?P<pk>d+)/$', views.bookdetail.as_view(), name='book_detail'),##有名分组,当设置了HyperlinkedIdentityField的时候
    '''
    讲解:
    当下面的url被访问的时候,执行的是下面的view方法

    被访问ul的时候,是就得requets方法,当执行这个下面的get,post等请求的时候,是新的requets
    注明一下:这个执行下面的方法的时候,是Apiview(执行dispath())
    dispatch()
    构建新的requtest对象
    '''



    生成序列化的类
    from rest_framework import serializers  ##这个是rest_frame的序列化组件
    from django.core import serializers ##序列化,这个是django序列化的一个组件
    from rest_framework.response import Response ##这个是rest_frame的响应组件

    class BookModelSerizter(serializers.ModelSerializer):
    class Meta:
    model=Book##(对book表进行操作)
    fields='__all__'
    '''
    HyperlinkedIdentityField

    ##下面相当于是加个连接url,当你访问那个url的时候,就进行反向解析这个url(HyperlinkedIdentityField)

    author = serializers.HyperlinkedIdentityField(
    view_name='book_detail', ##反向解析
    lookup_field='author_id', ##这里是取这个id值,当你循环到那个外键的那个id值的值的时候,作为参数传进去
    lookup_url_kwarg='pk' ##把还是那个面的id作为参数传进去,就是在url路由里面的有名分组
    )
    '''
    '''
    create方法:重写create方法,当你要对某一个字段进行操作的时候,不能用父类的create方法,source不能被解析出来
    # ####下面是基于modelserizter的自定制,对那个字段进行自定制
    # book_name=serializers.CharField()
    # author=serializers.CharField(source='author.pk')
    # # publish=serializers.SerializerMethodField()
    #
    # def create(self, validated_data):
    # print('全部的数据',validated_data)
    # ##全部的数据 {'book_name': 'julia', 'author': {'pk': '1'}, 'publish': [<Publish: 上海出版社>], 'book_price': [<Price: 1231.21>]}
    # Book.objects.create(book_name=validated_data['book_name'],author_id=validated_data['author']['pk'])##当不是manytomany的时候,就可以直接创建,外键有的时候,可以是author_id=validated_data['author_id']来创建
    # Book.publish.add(*validated_data['publish'])##因为是manytomany的关系,是列表的形式,要加*
    # Book.book_price.add(*validated_data['book_price'])####manytomany的关系是这样写的,是add 把数据添加进去
    # return Response(validated_data)

    '''






    查看所有的数据,和创建数据
    '''
    操作:
    查看所有的数据queryset类型,all()
    具体操作:
    all_list=Book.objects.all()
    handler=Bookserizter(all_list,many=True)##这个是序列化操作#序列化操作:将queryset和model对象》》json格式的数据
    return Response(handler_data)
    创建数据
    是post的请求,不需要传参数id进来
    requtes.data是接受到的创建的数据
    handler=Bookserizter(data=request.data)#反序列操作:将接受到的requets.data的json数据格式转化为queryset对象类型和model对象
    if handler.is_valid():
    handler.save()##保存的是queryset对象类型,已经进行反序列化的操作了
    保存的是queryset类型的数据

    return Response(handler.data)
    else;
    return Response(handler.errors)


    '''

    from rest_framework.views import APIView
    from django.utils.safestring import mark_safe
    from rest_framework.response import Response###导入这个response的模块
    class book(APIView):
    def get(self, request):##这个是get的请求方式的时候
    book_list=Book.objects.all()#拿到这个queryset的对象集合,queryset对象

    Book_ser=BookModelSerizter(book_list,many=True)
    print(Book_ser.data)
    # return HttpResponse(Book_ser.data)##作为字符串返回了,这个response是django自己的
    return Response(Book_ser.data)##这个是resframework里面的response,这个是resfrmework的response,使用这个的时候,会有一个页面出来


    def post(self,request):
    data=BookModelSerizter(data=request.data)####前面要加data,这样才可以提交数据进行校验
    ###后面是post请求的数据
    if data.is_valid():###进行校验判断
    print('suc')
    data.save()#保存数据进数据库,看父类源码,里面有creare的方法
    return Response(data.data)
    else:
    return Response(data.errors)


    查看单条数据,修改某个数据,删除某个数据

    ##下面是传了参数进来id
    '''
    操作:
    查看单条数据
    model_obj=Book.objects.filter(pk=id).first()##是一个model对象
    handler=BookModelSerizter(model_obj)##对model对象进行序列化出租(有序的字典orderdic)
    return Response(handler.data)##这个Response是resframe特有的方法,响应器orderdic转化成正常的字典的格式
    修改某一条数据(到那时post,put的请求的时候,都可以进行反序列的操作(修改和创建数据都是queryset对象类型)
    model_obj=Book.objects.filtr(pk=id).first()
    handler=BookModelSerizter(model_obj,data=request.data)###后面是接受到的数据,前面是对哪一个数据进行编辑操作,如果没有加前面的话,就是create的操作了
    if handler.is_valid():
    handler.save()
    retutn Response(handler.data)
    else;
    return Response(handler.errors)
    删除某一条数据
    delete_obj=book.objects.filter(pk=id).delete()
    return Response()##不返回值
    '''

    class bookdetail(APIView):

    # def get(self,request):
    # ##查看所有的书籍
    # book_list=Book.objects.all()
    # all_list=BookModelSerizter(book_list,many=True)
    #
    # return Response(all_list.data)

    def get(self,request,id):
        #def  get(self,request,pk):##按照这个命名来分组,传的名字是固定的('(?<pk>d+)'),名字是里面的pk,也可以是其他的名字

    ##查看单条数据
    print('执行get的请求')
    book_obj=Book.objects.filter(id=id).first()#####拿到的是queryset对象,下面进过序列化得到的是一个有序的字典,就可以渲染出来,更好的处理
    # after_data=BookModelSerizter(book_obj)
    after_data=BookModelSerizter(book_obj,context={'request':request})##文本类型,这个是和上面的连接有关,后面的参数context,HyperlinkedIdentityField,这个是设置了连接的时候,进行的操作
    return Response(after_data.data)
    ######将queryset或者是modle对象序列化成josn数据
    #### after_data=BookModelSerizter(book_obj)




    '''
    requets.data是进行post和put请求与的时候可以拿到
    body:requets.data

    构建request对象:
    self.requets=Request(request)
    self.reqeuts._reqeust

    get请求:requets.GET.get
    post,put请求:requets.data,这个是接受数据request.data
    分发get 请求
    dispatch()

    当进行get请求的时候,把这个queryset对象或者是model对象序列化成json数据
    当进行post,put的请求的时候,把这个requets.dtaa接受到的数据反序列化成queryset或者是model对象,然后才可以进行校验,保存等操作
    save的时候,是保存的queryset对象,,已经反序列化了(json》》queryset对象或者是model对象》》数据库里面的一个记录)


    '''




    def put(self,request,id):
    book_obj=Book.objects.filter(id=id).first()#####拿到的是queryset对象,下面进过序列化得到的是一个有序的字典,就可以渲染出来,更好的处理
    after_hander=BookModelSerizter(book_obj,data=request.data)###对前面的哪一个表的数据进行编辑操作,如果不加前面的话就会是创建数据的操作
    #########后面的data是有requets表单里面的数据的时候,要加参数data,就知道哦啊是form_data里面的数据
    if after_hander.is_valid():
    after_hander.save()
    return Response(after_hander.data)###返回这个已经修改好的数据回来,返回传这个已经序列化好的数据出来
    else:

    return Response(after_hander.errors)


    def delete(self,request,id):
    Book.objects.filter(pk=id).delete()

    return Response('删除成功')






  • 相关阅读:
    Kubernetes 集群日志管理
    登录功能通用测试用例设计
    Linux常用命令大全
    查看Android应用包名、Activity的几个方法
    CentOS 7 下Docker的安装
    Centos7.1下Docker的安装-yum方法
    appium+Java+testng自动化框架搭建-第一季
    Android在Win10环境搭建
    List<Map<String, Integer>> 同key的value全部累加合并
    Restrictions用法
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/9843551.html
Copyright © 2011-2022 走看看