(一)项目结构
(一)创建数据库模型booktest/models.py
from django.db import models
class Book(models.Model):
id = models.AutoField(primary_key=True) # id 会自动创建,可以手动写入
title = models.CharField(max_length=32) # 书籍名称
# DecimalField用来限制数字大小,max_digits=5表示价格最大为五位数(包括了小数部分),decimal_places=2表示存储数字到小数点后2位
# 所以最大的价格就为:999.99
price = models.DecimalField(max_digits=5, decimal_places=2) # 书籍价格
publish = models.CharField(max_length=32) # 出版社名称
pub_date = models.DateField() # 出版时间
(二)数据库中手动添加几条数据用于测试
(三)booktest/views.py
import json
from django.views import View
from .models import Book
from django.http import JsonResponse, HttpResponse
class BookListView(View):
"""列表视图"""
def get(self, request):
"""查询所有图书接口"""
# 1.查询所有图书模型
books = Book.objects.all()
# 2.遍历所有查询集,取出里面每个书籍模型对象,把模型对象转化成字典
book_list = []
for book in books:
book_dict = {
'id': book.id,
'title': book.title,
'price': book.price,
'publish': book.publish,
'pub_date': book.pub_date
}
book_list.append(book_dict)
# 3.响应
# safe=False的作用当safe=True并且所传过来的data不是dict类型时,会引发异常,
# 提醒我们如果传过来的objects不是dict,将safe参数设置为False,就允许传非字典数据.
return JsonResponse(book_list, safe=False)
def post(self, request):
"""新增图书接口"""
# 获取前端传入的请求体数据(json) 用request.body获取
json_str_bytes = request.body
# 把bytes类型的json字符串转换成json_str
json_str = json_str_bytes.decode()
# 利用json.loads将json字符串转换成json(字典/列表)
book_dict = json.loads(json_str)
# 创建模型对象并保存(把字典转换成模型并存储)
book = Book(
title=book_dict['title'],
price=book_dict['price'],
publish=book_dict['publish'],
pub_date=book_dict['pub_date']
)
# 保存模型
book.save()
# 把新增的模型转换成字典
json_dict = {
'id': book.id,
'title': book.title,
'price': book.price,
'publish': book.publish,
'pub_date': book.pub_date
}
# 响应(把新增的数据再响应回去,201)
return JsonResponse(json_dict, status=201)
class BookDetailView(View):
"""详情视图"""
def get(self, request, pk):
"""查询指定某个图书接口"""
# 取出指定pk的那个模型对象
try:
book = Book.objects.get(id=pk)
except Book.DoesNotExist:
return HttpResponse({'message': '查询的数据不存在'}, status=404)
# 模型对象转字典
book_dict = {
'id': book.id,
'title': book.title,
'price': book.price,
'publish': book.publish,
'pub_date': book.pub_date
}
# 3、响应
return JsonResponse(book_dict)
def put(self, request, pk):
"""修改指定图书接口"""
# 先查询要修改的模型对象
try:
book = Book.objects.get(id=pk)
except Book.DoesNotExist:
return HttpResponse({'message': '要修改的数据不存在'}, status=404)
# 获取前端传入的新数据(把数据转换成字典)
json_str_bytes = request.body
json_str = json_str_bytes.decode()
book_dict = json.loads(json_str)
# book_dict=json.loads(request.body.decode())
# 重新给模型指定的属性赋值
book.title = book_dict['title']
book.price = book_dict['price']
book.publish = book_dict['publish']
book.pub_date = book_dict['pub_date']
# 调用save方法进行修改操作
book.save()
# 把修改后的模型再转换成字典
json_dict = {
"id": book.id,
"title": book.title,
"price": book.price,
"publish": book.publish,
"pub_date": book.pub_date
}
# 响应
return JsonResponse(json_dict)
def delete(self, request, pk):
"""删除指定书籍接口"""
# 获取要删除的模型对象
try:
book = Book.objects.get(id=pk)
except Book.DoesNotExist:
return HttpResponse({'message': '要删除的数据不存在'}, status=404)
# 删除模型对象
book.delete() # 物理删除(真正从数据库删除)
# book.is_delete = True
# book.save() # 逻辑删除
# 响应:删除时不需要有响应体但要指定状态码为204
return HttpResponse(status=204)
# 模型变成字典称为序列化(输出的过程)
# 字典变为模型称为反序列化(输入的过程)
# 以上的输入输出时对于数据库而言
(四)路由设置
booktest/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
# 列表视图的路由
url(r'^books/$', views.BookListView.as_view()),
# 详情视图的路由
url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view())
]
demo/urls.py
"""demo URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
urlpatterns = [
url(r'^', include('booktest.urls')) # 书籍模块
]
(五)postman测试接口
①查询所有书籍
②查询指定书籍
③新增书籍
④修改指定书籍
⑤删除指定书籍
(六)DRF的安装