- 先定义一个views.py的视图文件
-
#因为有时间字段,所以需要先导入datetime扩展包
from datetimme import datetime
#实际到视图所以需要导入Django自带的View扩展包
from django.view import View
#导入django中的响应扩展
from django.http import JsonResponse
#定义图书视图类
class BookAPIView(View):
'''
业务逻辑:查询所有图书、增加图书
'''
def get(self,request):
'''
查询所有图书
路由:GET /books/
'''
#查询数据库得到查询集:这里的BookInfo是我们之前定义好的模板类
queryset = BookInfo.objects.all( )
#查询集表示的是从数据库中获取的对象集合,想或得里面的数据需要遍历
book_list = []
for book in queryset:
book_list.append({
'id':book.id,
'btitle':book.btitle,
'bpub_date':book.bpub_date,
'bread':book.bread,
'bcomment':book.bcomment,
#image需要判断是存在,存放在,返回路径,不存在返回 None
'image':book.image.url if book.image else ''
})
return JsonResponse(book_list,safe=False)
#对safe的说明,我们传过去的book_list是一个list格式,在前端json支持{}也支持[]格式
#但是django中认为[]的json格式是不安全的会进行校验,所以把safe=False,不进行校验
def post(self,request):
'''
新增图书
路由:POST /books/
'''
#查询到的数据是二进制
json_bytes = request.body
#需要进行解码,转成字符串
json_str = json_bytes.decode()
#在把字符串转换成json字典
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,
'image':book.image.url if book.image else ''
},status=201)
获取单个图书信息、修改图书信息和删除图书信息都需要指定id所以这三项单独定一个类视图 - 代码如下:
class BookAPIView(View):
def get(self,request,pk):
'''
获取单个图书信息
路由:GET /books/<pk>/
'''
#获取单个数据可能或回去不到,会报错,所以需要tyr
try:
book = BookInfo.Objects.get(pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404)
return JsonResponse({
'id':book.id,
'btitle': book.btitle,
'bpub_date': book.bpub_date,
'bread': book.bread,
'bcomment': book.bcomment,
'image': book.image.url if book.image else ''
})
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,
'image': book.image.url if book.image else ''
})
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)
- 最后我们需要配置一下路由,定义一个urls.py文件
#需要导入路由扩展
from django.conf.urls import url
#导入视图
from . import views
#配置路由
urlpatterns = [
url(r'^books/$', views.BooksAPIVIew.as_view()),
url(r'^books/(?P<pk>\d+)/$', views.BookAPIView.as_view())
]
#类视图不能直接作为路由,所以需要加入 as_view(),把它当做一个视图函数去使用
当然我还还需要在总路由下面设置路由绑定到子路由 - 测试:我们可以使用Postman测试上述接口