drf基本使用
执行pip install djangorestframework
安装drf
简单实例
获取所有数据
DrfProject->urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('bookstore.urls')),
]
bookstore->urls.py
from django.contrib import admin
from django.urls import path, include
from bookstore import views
urlpatterns = [
path('books/', views.BookView.as_view()),
]
views.py
from django import http
from django.shortcuts import render
# Create your views here.
from django.views import View
from bookstore.models import Book
class BookView(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,
"publish":book.publish,
"comment":book.comment,
"read":book.read,
}
book_list.append(book_dict)
return http.JsonResponse(book_list,safe=False)
JsonResponse(book_list,safe=False)
为什么加safe=False?
查看源码可知,safe默认时且非dict类型时会抛出TypeError异常
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
json_dumps_params=None, **kwargs):
if safe and not isinstance(data, dict):
raise TypeError(
'In order to allow non-dict objects to be serialized set the '
'safe parameter to False.'
)
新增一个数据
**注意:**post请求url结尾加上’/’ http://127.0.0.1:8000/books/
views.py
import json
from django import http
from django.shortcuts import render
# Create your views here.
from django.views import View
from DrfProject import settings
from bookstore.models import Book
class BookView(View):
def post(self,request):
"""新增数据"""
#1.获取参数
dict_data=json.loads(request.body.decode())# json(字符串)转dict
# print(request.body.decode())# 字节utf8编码后(汉字)
# print(request.body)# 字节
# 参数会在数据校验中用到,这里数据校验省略
title=dict_data.get('title')
publish=dict_data.get('publish')
comment=dict_data.get('comment')
read=dict_data.get('read')
# 2.数据校验(省略)
# 3.数据入库
book=Book.objects.create(**dict_data)
# 4.返回响应
book_dict={
'id':book.id,
'title':book.title,
'publish':book.publish,
'read':book.read,
'comment':comment
}
return http.JsonResponse(book_dict)
settings.py
APPEND_SLASH=False # url get请求结尾要加'/' post请求结尾要加'/'
# APPEND_SLASH=True# 这是默认 post请求结尾要加'/'
获取单个实例
views.py
class BookDetailView(View):
def get(self,request,pk):
# 1.获取对象
book=Book.objects.get(pk=pk)
# 2.返回响应
book_dict = {
'id': book.id,
'title': book.title,
'publish': book.publish,
'read': book.read,
'comment': book.comment,
}
return http.JsonResponse(book_dict)
urls.py
urlpatterns = [
path('books/', views.BookView.as_view()),
path('books/<int:pk>', views.BookDetailView.as_view()),
]
更改单个实例
views.py
class BookDetailView(View):
def put(self,request,pk):
# 1.获取数据
dict_data = json.loads(request.body.decode())
# 2.更改数据库
Book.objects.filter(pk=pk).update(**dict_data)# 更改操作
book = Book.objects.get(pk=pk)# 获取更改之后的对象
book_dict = {# 返回更改后的结果
'id': book.id,
'title': book.title,
'publish': book.publish,
'read': book.read,
'comment': book.comment,
}
# 3.返回响应
return http.JsonResponse(book_dict)
删除单个实例
class BookDetailView(View):
def delete(self,request,pk):
# 1.获取要删除的对象
book=Book.objects.get(pk=pk)
book_dict = {
'id': book.id,
'title': book.title,
'publish': book.publish,
'read': book.read,
'comment': book.comment,
}
# 2.执行删除
book.delete()
# 3.返回响应
# book_dict初始化放在这里会使id=null
return http.JsonResponse(book_dict,status=204)