1、入门

1.1 参考blog

官方文档:http://www.django-rest-framework.org/tutorial/quickstart/#quickstart

yuan的Blog:http://www.cnblogs.com/yuanchenqi/articles/8719520.html

alice的Blog:https://www.cnblogs.com/alice-bj/p/9228402.html

1.2 restful协议

restful协议

---- 一切皆是资源,操作只是请求方式

  1. ----book表增删改查
    /books/ books
    /books/add/ addbook
    /books/(\d+)/change/ changebook
    /books/(\d+)/delete/ delbook
  2.  
  3. ----book表增删改查 url里面不能出现动词!!
    /books/ -----get books ----- 返回当前所有数据
    /books/ -----post books ----- 返回提交数据
  4.  
  5. /books/(\d+)-----get bookdetail ----- 返回当前查看的单条数据
    /books/(\d+)-----put bookdetail ----- 返回更新数据
    /books/(\d+)-----delete bookdetail ----- 返回空
  1.  

1.3 安装

pip install django

pip install djangorestframework

2. 序列化方法

序列化是什么? QuerySet-->list-->json

2.1 restdemo

model

  1. from django.db import models
  2.  
  3. class Book(models.Model):
  4. title=models.CharField(max_length=32)
  5. price=models.IntegerField()
  6. pub_date=models.DateField()
  7. publish=models.ForeignKey("Publish",on_delete=models.CASCADE)
  8. authors=models.ManyToManyField("Author")
  9. def __str__(self):
  10. return self.title
  11.  
  12. class Publish(models.Model):
  13. name=models.CharField(max_length=32)
  14. email=models.EmailField()
  15. def __str__(self):
  16. return self.name
  17.  
  18. class Author(models.Model):
  19. name=models.CharField(max_length=32)
  20. age=models.IntegerField()
  21. def __str__(self):
  22. return self.name

url

  1. from django.contrib import admin
  2. from django.urls import path
  3.  
  4. from app01 import views
  5.  
  6. urlpatterns = [
  7. path('admin/', admin.site.urls),
  8. path('publishes/', views.PublishView.as_view()),
  9. ]

view

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. # Create your views here.
  4. from django.views import View
  5.  
  6. from .models import Publish
  7. import json
  8.  
  9. class PublishView(View):
  10.  
  11. def get(self,request):
  12. # QuerySet-->vales取值--->list--->json
  13. publish_list = list(Publish.objects.all().values("name","email"))
  14.  
  15. return HttpResponse(json.dumps(publish_list))
  16.  
  17. def post(self,request):
  18. pass

database

  

data生成与迁移

  python manage.py makemigrations

  python manage.py migrate

运行django项目

  

2.2 方式1 :list()

2.3 方式2:model_to_dict(obj)

2.4 方式3:django serializers

2.5 方式4 :restframework  serializers (推荐)

2.6 code

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. # 为queryset,model对象做序列化
  4. from rest_framework import serializers # rest_framework的序列化组件
  5.  
  6. class PublishSerializers(serializers.Serializer):
  7. # 对哪些字段序列化
  8. name = serializers.CharField()
  9. email = serializers.EmailField()
  10.  
  11. from django.views import View
  12. from .models import Publish
  13. import json
  14.  
  15. class PublishView(View):
  16.  
  17. def get(self,request):
  18. # QuerySet--->list--->json
  19.  
  20. # 序列化方式1 # list()
  21. # publish_list = list(Publish.objects.all().values("name","email"))
  22. #return HttpResponse(json.dumps(publish_list))
  23.  
  24. # 序列化方式2 # model对象转换为dict
  25. # from django.forms.models import model_to_dict
  26. # publish_list = Publish.objects.all()
  27. # temp = []
  28. # for obj in publish_list:
  29. #
  30. # temp.append(model_to_dict(obj))
  31. #
  32. # # temp.append({
  33. # # "name":obj.name,
  34. # # "email":obj.email
  35. # # })
  36. #
  37. # return HttpResponse(temp)
  38. #
  39.  
  40. # 序列化方式3 # django的序列化组件
  41. # from django.core import serializers
  42. # publish_list = Publish.objects.all()
  43. # ret = serializers.serialize("json",publish_list)
  44. #
  45. # return HttpResponse(ret)
  46.  
  47. # 序列化方式4 rest_framework的序列化组件
  48. publish_list = Publish.objects.all()
  49. ret = PublishSerializers(publish_list,many=True)
  50.  
  51. return HttpResponse(ret.data)
  52.  
  53. def post(self,request):
  54. pass

3.取数据:APIView

3.1 Django的原生request

1.get取数据

2.post取数据

 

3. request实质就是http报文头

  1. (1)Django的原生request:
  2.  
  3. 浏览器 ------------- 服务器
  4.  
  5. "GET url?a=1&b=2 http/1.1\r\user_agent:Google\r\ncontentType:urlencoded\r\n\r\n"
  6. "POST url http/1.1\r\user_agent:Google\r\ncontentType:urlencoded\r\n\r\na=1&b=2"
  7.  
  8. request.body: a=1&b=2
  9. request.POST:
  10. if contentType:urlencoded:
  11. a=1&b=2----->{"a":1,"b":2}

4.发送json

3.2 原生request源码

content-type

3.3 restframework下的 APIView

1. 新的request 取数据

2. urlencoded类型的data

3. get请求

3.3 APIView源码

1. 继承了基本的View

2. APIView下的dispatch

 

3.4 view代码

get:

  request._request ( 原request )

  request.GET == request._request.GET

post:

  request.data ( 得到 json 数据,也可得到 urlencode 数据)

    都是 rest_framework  APIView 的功劳,

  如果使用 View , request.post( 只能得到 urlencode 的数据,不能得到 json 数据,只能从 request.body 中取)

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. from django.views import View
    from rest_framework.views import APIView
  4.  
  5. # class PublishView(View): # 原生View
  6. class PublishView(APIView): # APIView
  7.  
  8. def get(self,request):
  9.  
  10. # 取数据
  11. print("request.data ",request.data)
  12. print("request.data type ",type(request.data))
  13. print(request._request.GET) #旧的request
  14. print(request.GET)
  15. return HttpResponse("")
  16.  
  17. def post(self,request):
  18.  
  19. # 取数据
  20.  
  21. # 1 原生reqeust支持的操作
  22. # print("post...",request.POST)
  23. # print("body...",request.body)
  24.  
  25. # print(type(request)) # <class 'django.core.handlers.wsgi.WSGIRequest'>
  26. # from django.core.handlers.wsgi import WSGIRequest
  27.  
  28. # 2 新的reqeust支持的操作
  29. # request._request.POST # 取出旧的request
  30. print("request.data ",request.data)
  31. print("request.data type ",type(request.data))
  32.  
  33. return HttpResponse("POST")

4. 序列化字段:Serializer

4.1 准备demo

1. views

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. # 为queryset,model对象做序列化
  4. from rest_framework import serializers # rest_framework的序列化组件
  5. class PublishSerializers(serializers.Serializer):
  6. # 对哪些字段序列化
  7. name = serializers.CharField()
  8. email = serializers.EmailField()
  9.  
  10. # 为Book做序列化
  11. class BookSerializers(serializers.Serializer):
  12. title = serializers.CharField(max_length=32)
  13. price = serializers.IntegerField()
  14. pub_date = serializers.DateField()
  15.  
  16. from rest_framework.views import APIView
  17. class PublishView(APIView): # APIView
  18. def get(self,request):
  19. return HttpResponse("")
  20.  
  21. def post(self,request):
  22. return HttpResponse("POST")
  23.  
  24. from .models import Book
  25. class BookView(APIView):
  26. def get(self,request):
  27. book_list = Book.objects.all()
  28. bs = BookSerializers(book_list,many=True)
  29. return HttpResponse(bs.data)
  30.  
  31. def post(self,request):
  32. pass

2. database

Question报错:

  return datetime.date(*map(int, val.split(b"-")))
  OverflowError: Python int too large to convert to C long

原因:估计是sqlite中datetime的问题

    

解决办法:创建superuser,进入admin页面,添加书籍,生成到数据库的data

         

4.2 响应器 response

""" 响应器
针对 不同得访问者 浏览器 postman 做不同得处理
只有浏览器,用户 会给一个页面!!

几种请求方式
get post
get put delete
"""

1.Response继承了HttpResponse

2. restframework就是一个app,需要注册

    

3.get得到的data实质

4.3 默认打印__str__定制的字段

      

  1. # publish = serializers.CharField() # 默认打印 __str__定义的字段名
  2. publish = serializers.CharField(source="publish.name")

5. 如何一对多显示

  

  1. # 一对多
  2. # authors = serializers.CharField(source="authors.all") #"authors": "<QuerySet [<Author: alex>, <Author: yuan>]>"
  3. authors = serializers.SerializerMethodField()
  4. def get_authors(self,obj):
  5. temp = []
  6. for obj in obj.authors.all():
  7. temp.append(obj.name)
  8. return temp

4.4 序列化的过程

  1. """
  2. 序列化BookSerializers(book_list,many=True)过程
  3. temp = []
  4. for obj in book_list:
  5. temp.append({
  6. "title":obj.title,
  7. "price":obj.price,
  8. "pub_date":obj.pub_date,
  9. "publish":str(obj.publish), # obj.publish.name
  10. "authors":get_authors(obj)
  11. })
  12.  
  13. return HttpResponse(temp)
  14.  
  15. """

4.5 code代码

view

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. # 为queryset,model对象做序列化
  4. from rest_framework import serializers # rest_framework的序列化组件
  5.  
  6. class PublishSerializers(serializers.Serializer):
  7. # 对哪些字段序列化
  8. name = serializers.CharField()
  9. email = serializers.EmailField()
  10.  
  11. # 为Book做序列化
  12. class BookSerializers(serializers.Serializer):
  13. title = serializers.CharField(max_length=32)
  14. price = serializers.IntegerField()
  15. pub_date = serializers.DateField()
  16. # publish = serializers.CharField() # 默认打印 __str__定义的字段名
  17. publish = serializers.CharField(source="publish.name")
  18.  
  19. # 一对多
  20. # authors = serializers.CharField(source="authors.all") #"authors": "<QuerySet [<Author: alex>, <Author: yuan>]>"
  21. authors = serializers.SerializerMethodField()
  22. def get_authors(self,obj):
  23. temp = []
  24. for obj in obj.authors.all():
  25. temp.append(obj.name)
  26. return temp
  27.  
  28. from rest_framework.views import APIView
  29. class PublishView(APIView): # APIView
  30.  
  31. def get(self,request):
  32. return HttpResponse("")
  33.  
  34. def post(self,request):
  35. return HttpResponse("POST")
  36.  
  37. from .models import Book
  38. from rest_framework.response import Response
  39.  
  40. class BookView(APIView):
  41. def get(self,request):
  42. book_list = Book.objects.all()
  43. bs = BookSerializers(book_list,many=True)
  44.  
  45. # return HttpResponse(bs.data)
  46. return Response(bs.data) # Response继承HttpResponse
  47.  
  48. def post(self,request):
  49. pass

5.序列化模型:ModelSerializers

5.1 以Book为例

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. from .models import Book
  4.  
  5. from rest_framework import serializers # rest_framework的序列化组件
  6. from rest_framework.views import APIView
  7. from rest_framework.response import Response
  8.  
  9. class BookModelSerializers(serializers.ModelSerializer): # ModelSerializer
  10. class Meta:
  11. model = Book
  12. fields = '__all__'
  13.  
  14. class BookView(APIView):
  15. def get(self,request):
  16. book_list = Book.objects.all()
  17. bs = BookModelSerializers(book_list,many=True)
  18. return Response(bs.data) # Response继承HttpResponse
  19.  
  20. def post(self,request):
  21. pass
  22.  
  23. class PublishSerializers(serializers.Serializer):
  24. # 对哪些字段序列化
  25. name = serializers.CharField()
  26. email = serializers.EmailField()
  27.  
  28. class PublishView(APIView): # APIView
  29. def get(self,request):
  30. return HttpResponse("")
  31.  
  32. def post(self,request):
  33. return HttpResponse("POST")

5.2 get请求:显示书籍,自定制

自定制字段的source

     

  1. # 如何显示字段
  2. publish = serializers.CharField(source="publish.name") # 原生的create不接受自定制,需要重写create方法
  3.  
  4. authors = serializers.SerializerMethodField(source="authors.all")
  5. def get_authors(self,obj):
  6. temp = []
  7. for obj in obj.authors.all():
  8. temp.append(obj.name)
  9. return temp

5.3 post请求,保存书籍

1. 取消自定制的,source

create方法中没有source自定义

  1. def post(self,request):
  2. # post请求的数据
  3. bs = BookModelSerializers(data=request.data)
  4. if bs.is_valid():
  5. print(bs.validated_data)
  6. bs.save() # create方法
  7. return Response(bs.data)
  8. else:
  9. return Response(bs.errors)

2. 源码create

3. 发送json数据,提交到database

  

5.4 重写create方法

原生的create不接受自定制,需要重写create方法

  1. class BookModelSerializers(serializers.ModelSerializer): # ModelSerializer
  2. class Meta:
  3. model = Book
  4. fields = '__all__'
  5.  
  6. # 如何显示字段
  7. publish = serializers.CharField(source="publish.name") # 原生的create不接受自定制,需要重写create方法
  8.  
  9. # 重写create方法 # 不接受自定制字段,source
  10. def create(self, validated_data):
  11. print("validated_data...",validated_data)
  12. book = Book.objects.create(title=validated_data['title'],price=validated_data['price'],
  13. pub_date=validated_data['pub_date'],publish_id=validated_data['publish']['name'])
  14. book.authors.add(*validated_data['authors'])
  15.  
  16. return book

6.单条数据(get,put,delete)

6.1 解耦:新建serializer.py

1.serializer.py

  1. from rest_framework import serializers # rest_framework的序列化组件
  2.  
  3. from .models import Book
  4.  
  5. class PublishSerializers(serializers.Serializer):
  6. name = serializers.CharField()
  7. email = serializers.EmailField()
  8.  
  9. class BookModelSerializers(serializers.ModelSerializer): # ModelSerializer
  10. class Meta:
  11. model = Book
  12. fields = '__all__'

2. view.py

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. from rest_framework.views import APIView
  4. from rest_framework.response import Response
  5.  
  6. from app01.serilizer import BookModelSerializers # 从serilizer中导入
  7.  
  8. from .models import Book
  9.  
  10. class PublishView(APIView): # APIView
  11. def get(self,request):
  12. return HttpResponse("")
  13.  
  14. def post(self,request):
  15. return HttpResponse("POST")
  16.  
  17. class BookView(APIView):
  18. def get(self,request):
  19. book_list = Book.objects.all()
  20. bs = BookModelSerializers(book_list,many=True)
  21. return Response(bs.data) # Response继承HttpResponse
  22.  
  23. def post(self,request):
  24. # post请求的数据
  25. bs = BookModelSerializers(data=request.data)
  26. if bs.is_valid():
  27. print(bs.validated_data)
  28. bs.save() # create方法
  29. return Response(bs.data)
  30. else:
  31. return Response(bs.errors)

6.2 单条数据demo

urls:正则表达式用re_path

  1. from django.contrib import admin
  2. from django.urls import path
  3. from django.urls import re_path # 正则表达式的
  4.  
  5. from app01 import views
  6.  
  7. urlpatterns = [
  8. path('admin/', admin.site.urls),
  9.  
  10. path('publishes/', views.PublishView.as_view()), # view(request)====> APIView:dispatch()
  11. path('books/', views.BookView.as_view()),
  12. re_path(r'books/(\d+)/$', views.BookDetailView.as_view()),
  13. ]

view

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. from rest_framework.views import APIView
  4. from rest_framework.response import Response
  5.  
  6. from app01.serilizer import BookModelSerializers # 从serilizer中导入
  7.  
  8. from .models import Book
  9.  
  10. class PublishView(APIView): # APIView
  11. def get(self,request):
  12. return HttpResponse("")
  13.  
  14. def post(self,request):
  15. return HttpResponse("POST")
  16.  
  17. class BookView(APIView):
  18. def get(self,request):
  19. book_list = Book.objects.all()
  20. bs = BookModelSerializers(book_list,many=True)
  21. return Response(bs.data) # Response继承HttpResponse
  22.  
  23. def post(self,request):
  24. # post请求的数据
  25. bs = BookModelSerializers(data=request.data)
  26. if bs.is_valid():
  27. print(bs.validated_data)
  28. bs.save() # create方法
  29. return Response(bs.data)
  30. else:
  31. return Response(bs.errors)
  32.  
  33. class BookDetailView(APIView):
  34. def get(self,request,id):
  35. # 获取某本书的信息
  36. book = Book.objects.filter(pk=id).first() # 过滤单挑data
  37. bs = BookModelSerializers(book)
  38. return Response(bs.data)
  39.  
  40. def put(self,rquest,id):
  41. # 更新某本书的字段
  42. book = Book.objects.filter(pk=id).first()
  43. bs = BookModelSerializers(book,data=rquest.data)
  44. if bs.is_valid():
  45. bs.save() # 实质create方法
  46. return Response(bs.data)
  47. else:
  48. return Response(bs.errors)
  49.  
  50. def delete(self,request,id):
  51. # 删除某条数据
  52. Book.objects.filter(pk=id).delete()
  53. return Response("Delete 第%s本书成功"%(id))

get取数据

更新data

  1. { "title": "野兽绅士","price": 88, "pub_date": "2019-07-23","publish": 2,"authors": [1,2]}

   

delete

7.超链接API

7.1 配置publish为单条数据

urls

  1. from django.contrib import admin
  2. from django.urls import path
  3. from django.urls import re_path # 正则表达式的
  4.  
  5. from app01 import views
  6.  
  7. urlpatterns = [
  8. path('admin/', admin.site.urls),
  9.  
  10. path('publishes/', views.PublishView.as_view()), # view(request)====> APIView:dispatch()
  11. re_path(r'publishes/(\d+)/$', views.PublishDetailView.as_view()),
  12.  
  13. path('books/', views.BookView.as_view()),
  14. re_path(r'books/(\d+)/$', views.BookDetailView.as_view()),
  15. ]

serilizer

  1. from rest_framework import serializers # rest_framework的序列化组件
  2.  
  3. from .models import Book,Publish
  4.  
  5. class PublishSerializers(serializers.Serializer):
  6. name = serializers.CharField()
  7. email = serializers.EmailField()
  8.  
  9. class BookModelSerializers(serializers.ModelSerializer): # ModelSerializer
  10. class Meta:
  11. model = Book
  12. fields = '__all__'
  13.  
  14. class PublishModelSerializers(serializers.ModelSerializer): # ModelSerializer
  15. class Meta:
  16. model = Publish
  17. fields = '__all__'

views

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. from rest_framework.views import APIView
  4. from rest_framework.response import Response
  5.  
  6. from app01.serilizer import BookModelSerializers # 从serilizer中导入
  7. from app01.serilizer import PublishModelSerializers #
  8.  
  9. from .models import Book,Publish
  10.  
  11. class PublishView(APIView): # APIView
  12. def get(self,request):
  13. publish_list = Publish.objects.all()
  14. ps = PublishModelSerializers(publish_list,many=True)
  15. return Response(ps.data)
  16.  
  17. def post(self,request):
  18. ps = PublishModelSerializers(data=request.data)
  19. if ps.is_valid():
  20. ps.save()
  21. return Response(ps.data)
  22. else:
  23. return Response(ps.errors)
  24.  
  25. class PublishDetailView(APIView):
  26. def get(self,request,id):
  27. # 获取某publish的信息
  28. publish = Publish.objects.filter(pk=id).first()
  29. ps = PublishModelSerializers(publish)
  30. return Response(ps.data)
  31.  
  32. def put(self,request,id):
  33. # 更新某pub的信息
  34. publish = Publish.objects.filter(pk=id).first()
  35. ps = PublishModelSerializers(publish,data=request.data)
  36. if ps.is_valid():
  37. ps.save()
  38. return Response(ps.data)
  39. else:
  40. return Response(ps.errors)
  41.  
  42. def delete(self,request,id):
  43. # 删除某天publish
  44. Publish.objects.filter(pk=id).delete()
  45. return Response("Delete 第%s个出版社"%(id))
  46.  
  47. class BookView(APIView):
  48. def get(self,request):
  49. book_list = Book.objects.all()
  50. bs = BookModelSerializers(book_list,many=True)
  51. return Response(bs.data) # Response继承HttpResponse
  52.  
  53. def post(self,request):
  54. # post请求的数据
  55. bs = BookModelSerializers(data=request.data)
  56. if bs.is_valid():
  57. print(bs.validated_data)
  58. bs.save() # create方法
  59. return Response(bs.data)
  60. else:
  61. return Response(bs.errors)
  62.  
  63. class BookDetailView(APIView):
  64. def get(self,request,id):
  65. # 获取某本书的信息
  66. book = Book.objects.filter(pk=id).first() # 过滤单挑data
  67. bs = BookModelSerializers(book)
  68. return Response(bs.data)
  69.  
  70. def put(self,rquest,id):
  71. # 更新某本书的字段
  72. book = Book.objects.filter(pk=id).first()
  73. bs = BookModelSerializers(book,data=rquest.data)
  74. if bs.is_valid():
  75. bs.save() # 实质create方法
  76. return Response(bs.data)
  77. else:
  78. return Response(bs.errors)
  79.  
  80. def delete(self,request,id):
  81. # 删除某条数据
  82. Book.objects.filter(pk=id).delete()
  83. return Response("Delete 第%s本书成功"%(id))

7.2 配置超链接

1.效果图

2.urls

3.serilizer中,定义超链接

4.view中id修改pk

5. view中调用 Serializers的地方,重新什么request

7.3 code代码

urls

  1. from django.contrib import admin
  2. from django.urls import path
  3. from django.urls import re_path # 正则表达式的
  4.  
  5. from app01 import views
  6.  
  7. urlpatterns = [
  8. path('admin/', admin.site.urls),
  9.  
  10. path('publishes/', views.PublishView.as_view()), # view(request)====> APIView:dispatch()
  11. re_path(r'publishes/(?P<pk>\d+)/$', views.PublishDetailView.as_view(),name="detailPublish"),
  12.  
  13. path('books/', views.BookView.as_view()),
  14. re_path(r'books/(\d+)/$', views.BookDetailView.as_view()),
  15. ]

views

  1. from django.shortcuts import render,HttpResponse
  2.  
  3. from rest_framework.views import APIView
  4. from rest_framework.response import Response
  5.  
  6. from app01.serilizer import BookModelSerializers # 从serilizer中导入
  7. from app01.serilizer import PublishModelSerializers #
  8.  
  9. from .models import Book,Publish
  10.  
  11. class PublishView(APIView): # APIView
  12. def get(self,request):
  13. publish_list = Publish.objects.all()
  14. ps = PublishModelSerializers(publish_list,many=True)
  15. return Response(ps.data)
  16.  
  17. def post(self,request):
  18. ps = PublishModelSerializers(data=request.data)
  19. if ps.is_valid():
  20. ps.save()
  21. return Response(ps.data)
  22. else:
  23. return Response(ps.errors)
  24.  
  25. class PublishDetailView(APIView):
  26. def get(self,request,pk):
  27. # 获取某publish的信息
  28. publish = Publish.objects.filter(pk=pk).first()
  29. ps = PublishModelSerializers(publish)
  30. return Response(ps.data)
  31.  
  32. def put(self,request,pk):
  33. # 更新某pub的信息
  34. publish = Publish.objects.filter(pk=pk).first()
  35. ps = PublishModelSerializers(publish,data=request.data)
  36. if ps.is_valid():
  37. ps.save()
  38. return Response(ps.data)
  39. else:
  40. return Response(ps.errors)
  41.  
  42. def delete(self,request,pk):
  43. # 删除某天publish
  44. Publish.objects.filter(pk=pk).delete()
  45. return Response("Delete 第%s个出版社"%(pk))
  46.  
  47. class BookView(APIView):
  48. def get(self,request):
  49. book_list = Book.objects.all()
  50. bs = BookModelSerializers(book_list,many=True,context={'request':request})
  51. return Response(bs.data) # Response继承HttpResponse
  52.  
  53. def post(self,request):
  54. # post请求的数据
  55. bs = BookModelSerializers(data=request.data,context={'request':request})
  56. if bs.is_valid():
  57. print(bs.validated_data)
  58. bs.save() # create方法
  59. return Response(bs.data)
  60. else:
  61. return Response(bs.errors)
  62.  
  63. class BookDetailView(APIView):
  64. def get(self,request,id):
  65. # 获取某本书的信息
  66. book = Book.objects.filter(pk=id).first() # 过滤单挑data
  67. bs = BookModelSerializers(book,context={'request':request})
  68. return Response(bs.data)
  69.  
  70. def put(self,request,id):
  71. # 更新某本书的字段
  72. book = Book.objects.filter(pk=id).first()
  73. bs = BookModelSerializers(book,data=request.data,context={'request':request})
  74. if bs.is_valid():
  75. bs.save() # 实质create方法
  76. return Response(bs.data)
  77. else:
  78. return Response(bs.errors)
  79.  
  80. def delete(self,request,id):
  81. # 删除某条数据
  82. Book.objects.filter(pk=id).delete()
  83. return Response("Delete 第%s本书成功"%(id))

serilizer

  1. from rest_framework import serializers # rest_framework的序列化组件
  2.  
  3. from .models import Book,Publish
  4.  
  5. class PublishSerializers(serializers.Serializer):
  6. name = serializers.CharField()
  7. email = serializers.EmailField()
  8.  
  9. class BookModelSerializers(serializers.ModelSerializer): # ModelSerializer
  10. class Meta:
  11. model = Book
  12. fields = '__all__'
  13.  
  14. # 显示超链接,在Book下的publish
  15. publish = serializers.HyperlinkedIdentityField(
  16. view_name="detailPublish", # 别名 含正则表达式
  17. lookup_field="publish_id", # publish_id替换pk
  18. lookup_url_kwarg="pk", # url中的pk
  19. )
  20.  
  21. class PublishModelSerializers(serializers.ModelSerializer): # ModelSerializer
  22. class Meta:
  23. model = Publish
  24. fields = '__all__'

8. 今日总结

  1. day 96
  2.  
  3. CBVFBV
  4.  
  5. restful协议
  6.  
  7. ---- 一切皆是资源,操作只是请求方式
  8.  
  9. ----book表增删改查
  10. /books/ books
  11. /books/add/ addbook
  12. /books/(\d+)/change/ changebook
  13. /books/(\d+)/delete/ delbook
  14.  
  15. ----book表增删改查
  16. /books/ -----get books ----- 返回当前所有数据
  17. /books/ -----post books ----- 返回提交数据
  18.  
  19. /books/(\d+)-----get bookdetail ----- 返回当前查看的单条数据
  20. /books/(\d+)-----put bookdetail ----- 返回更新数据
  21. /books/(\d+)-----delete bookdetail ----- 返回空
  22.  
  23. class Books(View):
  24. def get(self,request):
  25. pass # 查看所有书籍
  26.  
  27. def post(self,request):
  28. pass # 添加书籍
  29.  
  30. class BooksDetail(View):
  31. def get(self,request,id):
  32. pass # 查看具体书籍
  33.  
  34. def put(self,request,id):
  35. pass # 更新某本书籍
  36.  
  37. def delete(self,request,id):
  38. pass # 删除某本书籍
  39.  
  40. restframework(Django)
  41.  
  42. ----针对数据:json
  43.  
  44. (1)Django的原生request:
  45.  
  46. 浏览器 ------------- 服务器
  47.  
  48. "GET url?a=1&b=2 http/1.1\r\user_agent:Google\r\ncontentType:urlencoded\r\n\r\n"
  49. "POST url http/1.1\r\user_agent:Google\r\ncontentType:urlencoded\r\n\r\na=1&b=2"
  50.  
  51. request.body: a=1&b=2
  52. request.POST:
  53. if contentType:urlencoded:
  54. a=1&b=2----->{"a":1,"b":2}
  55.  
  56. (2)restframework 下的APIView
  57.  
  58. (3)
  59. class PublishSerializers(serializers.Serializer):
  60. name=serializers.CharField()
  61. email=serializers.CharField()
  62.  
  63. PublishSerializers(queryset,many=true)
  64. PublishSerializers(model_obj)
  65.  
  66. 总结:
  67. 1 reuqest类----源码
  68.  
  69. 2 restframework 下的APIView--源码
  70.  
  71. url(r'^books/$', views.BookView.as_view(),name="books")# View下的view
  72.  
  73. books/一旦被访问: view(request) ------APIView: dispatch()
  74.  
  75. 3 def dispatch():
  76.  
  77. 构建request对象
  78. self.request=Request(request)
  79. self.request._request
  80. self.request.GET # get
  81. self.request.data # POST PUT
  82.  
  83. 分发----if get请求:
  84. if request.method.lower() in self.http_method_names:
  85. handler = getattr(self, request.method.lower(),
  86. self.http_method_not_allowed)
  87. else:
  88. handler = self.http_method_not_allowed
  89.  
  90. response = handler(request, *args, **kwargs) # self.get(request, *args, **kwargs)
  91.  
  92. return response
  93.  
  94. 4 序列化类
  95. # from django.core import serializers
  96. # ret=serializers.serialize("json",publish_list)
  97.  
  98. restframework下的序列类 BookModelSerializers
  99. queryset或者model对象序列成一json数据
  100. bs=BookModelSerializers(book_list,many=True,context={'request': request})
  101. bs=BookModelSerializers(book,context={'request': request})
  102.  
  103. 还可以做校验数据,json-------》queryset/model-->记录
  104.  
  105. bs=BookModelSerializers(data=request.data)
  106. if bs.is_valid():
  107. print(bs.validated_data)
  108. bs.save() # 重写create方法
  109. 5 操作数据:
  110.  
  111. Book表为例
  112. class BookView(APIView):
  113. # 查看所有书籍
  114. def get(self,request):
  115. book_list=Book.objects.all()
  116. bs=BookModelSerializers(book_list,many=True,context={'request': request})
  117. return Response(bs.data)
  118.  
  119. # 添加一本书籍
  120. def post(self,request):
  121. # post请求的数据
  122. bs=BookModelSerializers(data=request.data)
  123. if bs.is_valid():
  124. print(bs.validated_data)
  125. bs.save()# create方法
  126. return Response(bs.data)
  127. else:
  128. return Response(bs.errors)
  129.  
  130. class BookDetailView(APIView):
  131. # 查看一本书籍
  132. def get(self,request,id):
  133.  
  134. book=Book.objects.filter(pk=id).first()
  135. bs=BookModelSerializers(book,context={'request': request})
  136. return Response(bs.data)
  137. # 更新一本书籍
  138. def put(self,request,id):
  139. book=Book.objects.filter(pk=id).first()
  140. bs=BookModelSerializers(book,data=request.data)
  141. if bs.is_valid():
  142. bs.save()
  143. return Response(bs.data)
  144. else:
  145. return Response(bs.errors)
  146. # 删除某一本书籍
  147. def delete(self,request,id):
  148. Book.objects.filter(pk=id).delete()
  149.  
  150. return Response()
  151.  
  152. restframework
  153.  
  154. 1 APIView
  155. 2 序列组件
  156. 3 视图、
  157. 4 组件(认证权限频率)
  158. 5 数据解析器
  159. 6 分页和Response

2 APIView与序列化组件的更多相关文章

  1. rest-framework框架——APIView和序列化组件

    一.快速实例 Quickstart http://www.cnblogs.com/yuanchenqi/articles/8719520.html restful协议 ---- 一切皆是资源,操作只是 ...

  2. rest-framework之APIView 序列化组件

    rest-framework之APIView 一 安装djangorestframework 方式一:pip3 install djangorestframework 方式二:pycharm图形化界面 ...

  3. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

  4. DjangoRestFramework 学习之restful规范 APIview 解析器组件 Postman等

    DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...

  5. cvb源码分析,resful规范,drf,drf序列化组件,95

    1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...

  6. drf 之序列化组件

    序列化 把Python中对象转换为json格式字符串 反序列化 把json格式转为为Python对象. 用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串. 序列化两大功能 ...

  7. DRF 序列化组件

    Serializers 序列化组件 Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objec ...

  8. python全栈开发day99-DRF序列化组件

    1.解释器组件源码分析 https://www.processon.com/view/link/5ba0a8e7e4b0534c9be0c968 2.基于CBV的接口设计 1).django循环que ...

  9. Serializers 序列化组件

    Serializers 序列化组件   为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转 ...

随机推荐

  1. Spring系列三:IoC 与 DI

    水晶帘动微风起,满架蔷薇一院香. 概述 在软件工程中,控制反转(IoC)是一种设计思想,对象之间耦合在一起,在运行时自动绑定,并且它们编译时对所需要引用的对象是不确定的.在这个spring教程中,通过 ...

  2. readlink、find-exec参数、file命令

    一.readlink:查看符号链接文件的内容 语法       readlink [选项] ...文件... 描述       打印符号链接或规范文件名的值 -f,--canonicalize     ...

  3. Elastic Search常用元数据简介

    在ES中,除了定义的index,type,和管理的document外,还有若干的元数据.这些元数据用于记录ES中需要使用的核心数据.在ES中,元数据通常使用下划线’_’开头. 1 查看数据GET /i ...

  4. frp基础操作

    [common]privilege_mode = true privilege_token = ****bind_port = 7000 dashboard_user = 444444dashboar ...

  5. 将磁盘从FAT格式转换为NTFS格式的方法

    不需要进行格式化,只需在命令提示符中输入如下内容:CONVERT X:/FS:NTFS把X换成你需要的盘符,转一个盘需十几或几十秒不等..注意:此方法不可逆转,FAT32转到NTFS后不可转回,当然也 ...

  6. URL的 ? 和 # (hash),如何将参数保存在URL中,用于刷新获取之前的变量?

    URL中会带上参数,假如是?开头的,那这个是会被加入到ajax请求中的,#(hash)相当于书签锚点,用于定位页面,不会加入到ajax请求中,所以有些时候,我们可以把一些参数放在#后面 如何获取URL ...

  7. mockjs介绍

    官网 https://github.com/nuysoft/Mock/wiki/Getting-Started 一.为什么使用mockjs 在做开发时,当后端的接口还未完成,前端为了不影响工作效率,手 ...

  8. java enum类自定义属性

    enum类自定义属性 这就是enum比static静态变量好用的地方了,可以赋予每一个枚举值若干个属性,例如 实例1: public enum GasStationChannel { ZH(" ...

  9. httpclient 上传附件实例

    httpclient 单附件上传实例  (扩展多附件上传实例,点我) /** * 上传附件 * @param host * @param uri * @param filePath 文件路径 * @p ...

  10. YII2中controller中的behaviors中的behavior内部是如何被使用的?

    1. behaviors方法的调用: 在祖先对象components中有一个ensureBehaviors方法,代码如下: /** * Makes sure that the behaviors de ...