1、新建一个django项目名称为restframeworkdemo,app名称为booktest
2、创建数据库,并在setting.py中设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #连接数据库的类型
'NAME': 'restframeworkdemo', #数据库名
'HOST':'127.0.0.1', #数据库主机
'PORT':3306,
"USER":'root',
'PASSWORD':'123456',
}
}
3、models.py中创建图书模型类BookInfo
from django.db import models
# Create your models here.
# 定义图书模型类BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name='名称')
bpub_date = models.DateField(verbose_name='发布日期')
bread = models.IntegerField(default=0, verbose_name='阅读量')
bcomment = models.IntegerField(default=0, verbose_name='评论量')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
# 注意,如果模型已经迁移建表并且表中如果已经有数据了,那么后新增的字段,必须给默认值或可以为空,不然迁移就报错
class Meta:
db_table = 'tb_books' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.btitle
4、然后在控制台执行下面命令创建表
python manage.py makemigrations # 记录models的变化,将变更记录记录到 对应APP下的migrations
python manage.py migrate ## 翻译成SQL语句,去数据库执行
创建一个test.py然后执行,往表里写一点测试数据
import os,django,sys
sys.path.append('./')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "restframeworkdemo.settings")# project_name 项目名称
django.setup()
from booktest.models import BookInfo
book1 = BookInfo.objects.create(
btitle='西游记',
bpub_date='1997-11-11'
)
book2 = BookInfo.objects.create(
btitle='三国演义',
bpub_date='1998-11-11'
)
book3 = BookInfo.objects.create(
btitle='红楼梦',
bpub_date='1999-11-11'
)
5、views.py 中定义CBV,BookListView查询所有图书及新增图书,BookDetailView负责查询、修改和删除某个图书
from django.views import View
from django.http import HttpResponse,JsonResponse
from .models import BookInfo
import json
from datetime import datetime
class BookListView(View):
'''
列表视图
'''
def get(self,request):
#查询所有图书接口
#1、查询出所有图书模型
books=BookInfo.objects.all()
#2、遍历查询集,取出里面的每个书籍模型对象,把模型对象转换成字典
book_list=[]
for book in books:
book_dict={
'id':book.id,
'btitle':book.btitle,
'bpub_date':book.bpub_date,
'bread':book.bread,
'bcomment':book.bcomment,
}
book_list.append(book_dict)
# 3、响应,非字典类型需要设置safe=False
return JsonResponse(book_list,safe=False)
def post(self, request):
"""
新增图书
路由:POST /books/
"""
json_bytes = request.body
json_str = json_bytes.decode()
book_dict = json.loads(json_str)
# 此处详细的校验参数省略
book = BookInfo.objects.create(
btitle=book_dict.get('btitle'),
bpub_date=datetime.strptime(book_dict.get('bpub_date'), '%Y-%m-%d').date()
)
return JsonResponse({
'id': book.id,
'btitle': book.btitle,
'bpub_date': book.bpub_date,
'bread': book.bread,
'bcomment': book.bcomment,
}, status=201)
class BookDetailView(View):
'''
详情视图
'''
def get(self,request,pk):
#查询指定图书接口
#1、获取出指定pk的那个模型对象
try:
book=BookInfo.objects.get(id=pk)
except BookInfo.DoesNotExist:
return HttpResponse({'message':'查询的数据不存在'},status=404)
#2、模型对象转字典
book_dict = {
'id': book.id,
'btitle': book.btitle,
'bpub_date': book.bpub_date,
'bread': book.bread,
'bcomment': book.bcomment,
}
#3、响应
return JsonResponse(book_dict)
def put(self, request, pk):
"""
修改图书信息
路由: PUT /books/<pk>
"""
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404)
json_bytes = request.body
json_str = json_bytes.decode()
book_dict = json.loads(json_str)
# 此处详细的校验参数省略
book.btitle = book_dict.get('btitle')
book.bpub_date = datetime.strptime(book_dict.get('bpub_date'), '%Y-%m-%d').date()
book.save()
return JsonResponse({
'id': book.id,
'btitle': book.btitle,
'bpub_date': book.bpub_date,
'bread': book.bread,
'bcomment': book.bcomment,
})
def delete(self, request, pk):
"""
删除图书
路由: DELETE /books/<pk>/
"""
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404)
book.delete()
return HttpResponse(status=204)
6、主项目下urls.py,将路由转到到子项目
from django.urls import re_path,include
urlpatterns = [
re_path('^',include('booktest.urls'))
]
7、booktest下urls.py,将路由转到处理的CBV中
from django.urls import path,re_path
from . import views
urlpatterns = [
#列表视图的路由
re_path(r'^books/$',views.BookListView.as_view()),
re_path(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view())
]
8、然后使用postman测试下接口
(1)直接get请求http://127.0.0.1:8000/books/
获取全部图书信息
(2)GET http://127.0.0.1:8000/books/2/
获取单个图书信息
(3)POST http://127.0.0.1:8000/books/
新增图书数据
(4)POSThttp://127.0.0.1:8000/books/9/
修改图书数据
get查看一下已经修改成功
(5)DELETE http://127.0.0.1:8000/books/9/
删除图书数据,返回204