APIView是继承自CBV的view类,因此先说一下CBV。APIView重写了request请求,本来reqest.POST只能访问urlencode的参数,却无法访问json格式的数据。重新的request能够访问json数据。
#路由部分
from django.urls import path
from app01 import views
urlpatterns = [
path('book/', views.BookView.as_view())
]
#views类
#FBV
"""
面向过程的函数视图
"""
# def book(request):
# if request.method == "GET":
# return HttpResponse("GET请求...")
#
# else:
# return HttpResponse("POST请求...")
#CBV
from django.shortcuts import render, HttpResponse
from django.views import View
class BookView(View):
def get(self, request):
return HttpResponse("view get")
def post(self, request):
return HttpResponse("view post")
2、DRF框架
安装DRF
APIView是DRF框架的一个view函数,重写了request函数,解决了之前post不接受json的数据。
#路由不变,只是重写了request请求的方法
from rest_framework.views import APIView
class BookView(APIView):
def get(self, request):
print("query_params:", request.query_params)
return HttpResponse("view get")
def post(self, request):
print(request.data)
return HttpResponse("view post")
def delete(self, request):
return HttpResponse(request.query_params)
二、Django数据库的设置
1、假如出现os问题,一般是settings文件没有引入os,直接import os即可
2、使用sqlite3数据库的settings文件设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
3、右边添加数据库
4、使用mysql数据库的settings文件设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 数据库主机
'PORT': 3306, # 数据库端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库用户密码
'NAME': 'exx' # 数据库名字
}
}
5、数据库更新
构造表结构数据库python manage.py makemigrations
迁移数据库python manage.py migrate
三、序列化
from rest_framework import serializers
from rest_framework.response import Response
# 针对模型设计序列化器
class BookSerializers(serializers.Serializer):
title = serializers.CharField(max_length=3)
price = serializers.IntegerField(required=False)
date = serializers.DateField(source="pub_date")
class BookView(APIView):
def get(self, request):
# 获取所有的书籍
book_list = Book.objects.all() # queryset[book01,book02,...]
# 构建序列化器对象:
serializer = BookSerializers(instance=book_list, many=True)
'''
temp = []
for obj in book_list:
d = {}
d["title"] = obj.title
d["price"] = obj.price
# d["pub_date"] = obj.pub_date
temp.append(d)
'''
return Response(serializer.data)
def post(self, request):
# 获取请求数据
print("data", request.data)
# 构建序列化器对象
serializer = BookSerializers(data=request.data)
# 校验数据
if serializer.is_valid(): # 返回一个布尔值,所有字段皆通过才返回True,serializer.validated_data serializer.errors
# 数据校验通过,将数据插入到数据库中
new_book = Book.objects.create(**serializer.validated_data)
return Response(serializer.data)
else:
# 校验失败
return Response(serializer.errors)



