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('删除成功')

ModelSerializer序列化(Apiview)的更多相关文章

  1. ModelSerializer序列化器实战

    目录 ModelSerializer序列化器实战 单表操作 序列化器类 视图类 路由 模型 多表操作 models.py serializer.py views.py urls.py ModelSer ...

  2. DRF框架之ModelSerializer序列化器

    ModelSerializer是Serializer的子类,序列化和反序列化跟Serializer一样. ModelSerializer与常规的Serializer相同,但提供了: 基于模型类自动生成 ...

  3. python测试开发django-rest-framework-65.序列化(ModelSerializer)

    前言 serializers.Serializer可以对modle模型中的字段序列化,并且必须写create和update两个方法.ModelSerializer可以看成是Serializer的一个升 ...

  4. drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)

    ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...

  5. 5) ModelSerializer(重点) 基表 测试脚本 多表关系建外键 正反查 级联 插拔式连表 序列化反序列化整合 增删查 封装response

    一.前戏要做好 配置:settings.py #注册drf INSTALLED_APPS = [ # ... 'api.apps.ApiConfig', 'rest_framework', ] ​ # ...

  6. Serializers 序列化组件——ModelSerializer详解

    前面学习Serializers用法时,发现所有的序列化都与我们的模型紧密相关. django_restframework也给我提供了跟模型紧密相关的序列化器——ModelSerializer. 它会根 ...

  7. DRF序列化和反序列化(二:ModelSerializer)

    一: rest_framework 中 serializers.Serializer的不方便之处(以下简称Serializer) a:需要定义每一个字段,并且这个字段是和models字段及其类似. b ...

  8. 序列化器:ModelSerializer

    ModelSerializer 类提供了一个快捷方式,可让你基于 Models 自动创建一个 Serializer 类,其中的字段与模型类字段对应. ModelSerializer 类与常规 Seri ...

  9. Django rest framework(6)----序列化(2)

    为什么要序列化 django 查询数据库返回的类型是  queryset 类型 而我们和前端通信使用的大多数是json类型,这个时候我们需要把 queryset的数据类型转换成python的数据类型然 ...

随机推荐

  1. maven更新项目版本

    mvn versions:set -DnewVersion=1.0.1-SNAPSHOT // 此操作会生成pom备份文件,推荐使用 mvn versions:set -DnewVersion=1.1 ...

  2. SSM框架的搭建和测试(Spring+Spring MVC+MyBatis)

    Spring MVC:MVC框架,通过Model-View-Controller模式很好的将数据,业务与展现进行分离. MyBatis:数据持久层框架 我这里使用的是MyEclipse 2016 CI ...

  3. Unable to find CMake in android studio

  4. 一、VS2017 的创建程序

    1.1 创建第一个子程序 1.1.1 创建项目 打开 VS2017,选择菜单栏 [文件]->[新建]->[项目]: 点击[确定]后,弹出如下界面: 点击[下一步]: 选择 空项目, 然后点 ...

  5. Codeforces 1043F(容斥+dp)

    题目链接 题意 是否存在选择方案使所选的数$gcd=1$ 思路 $f[i][j]$表示选$i$个数$gcd=j$的方案数,$cnt[i]$表示包含因子$i$的数的个数,则$f[i][j]=$$C_{c ...

  6. NPOI 列宽自适应 代码示例

    //列宽自适应,只对英文和数字有效 for (int i = 0; i <= maxColumn; i++) { sheet.AutoSizeColumn(i); } //获取当前列的宽度,然后 ...

  7. Python 爬虫二 requests模块

    requests模块 Requests模块 get方法请求 整体演示一下: import requests response = requests.get("https://www.baid ...

  8. Git命令执行漏洞

    Git命令造成的反弹shell 漏洞描述: Git LFS可以.lfsconfig使用LFS由存储库中的文件配置(部分),并且可以将Git LFS指向ssh://. [lfs] url = ssh:/ ...

  9. 自动安装gulpfile中所有依赖的模块

    在gulpfile.js中定义任务的时候,需要引用不同的模块,这些模块需要使用 npm install --save-dev 命令进行安装,非常的繁琐.可以使用一个名为gulpfile-install ...

  10. 2016521-Java-第八周学习总结

    课本知识点 start() run()定义线程线程对象被调度之后所执行的操作 -sleep(int millsecond),必须在try-catch语句块中调用sleep方法 sAlive() 线程同 ...