介绍
drf是django项目中为了方便快捷实现前后端分离,并且很好遵循RESTful接口风格所提供的框架或者也可以叫模块,其依赖于django。
优点
优点很多,不一一举例了,django前后端分离项目的好帮手
- 提供了定义序列化器Serializer的方法,方便序列化/反序列化;
- 提供了丰富的类视图
- 身份认证和权限认证
- 特有的 API web 界面
安装
pip install djangorestframework
因为我的django是1.11.11的,所以我安装的drf版本为3.11.2,版本差异安装时不会报错,但是启动时会有各种问题的话就尝试更换版本
小试
上代码,对比一下传统django做前后端分离和使用drf做前后端分离的差异
此处为传统django实现(新创建一个book子项目)
model
from django.db import models
from django.db import models
#定义图书模型类
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
#定义英雄模型类
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
hname = models.CharField(max_length=20, verbose_name='名称')
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'tb_heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name
def __str__(self):
return self.hname
view
class BookView(View):
"""
增删改查
"""
def get(self, request, pk):
# 1、查询数据对象
try:
book = BookInfo.objects.get(id=pk)
except:
return JsonResponse({'error': '错误信息'}, status=400)
return JsonResponse(
{
'id': book.id,
'btitle': book.btitle,
'bread': book.bread,
'bcomment': book.bcomment,
'bpub_date': book.bpub_date,
}
)
def put(self, request, pk):
# 1、获取前端数据
data = request.body.decode()
data_dict = json.loads(data)
# 2、验证数据
btitle = data_dict.get('btitle')
bpub_date = data_dict.get('bpub_date')
if bpub_date is None or bpub_date is None:
return JsonResponse({'error': '错误信息'}, status=400)
# 3、更新数据
try:
book=BookInfo.objects.get(id=pk)
except:
return JsonResponse({'error': '错误信息'}, status=400)
book.btitle=btitle
book.bpub_date=bpub_date
book.save()
# 4、返回结果
return JsonResponse(
{
'id': book.id,
'btitle': book.btitle,
'bread': book.bread,
'bcomment': book.bcomment,
'bpub_date': book.bpub_date,
}
)
def delete(self, request, pk):
# 1、查询数据对象
try:
book = BookInfo.objects.get(id=pk)
except:
return JsonResponse({'error': '错误信息'}, status=400)
book.is_delete=True
book.save()
return JsonResponse({})
url
urlpatterns = [
url(r'^books/(?P<pk>\d+)/$', views.BookView.as_view()),
]
结果展示
{
"id": 1,
"btitle": "三国演义",
"bread": 89,
"bcomment": 110,
"bpub_date": "2021-07-03"
}
此处为drf实现(新创建一个book_drf子项目)
因为drf核心功能之一就是帮我们减轻了序列化和反序列化的工作,我们只需要自定义一个序列化的类,图片所示的位置新建一个python文件serializer.py
内容如下
serializer
from rest_framework import serializers
# 自定义序列化器
class BookSerialzier(serializers.Serializer):
# 此处是你先要返回字段内容,注意字段名和字段类型,字段名和数据库字段名保持一致,字段类型也是如此
btitle = serializers.CharField()
bread = serializers.IntegerField()
bpub_date = serializers.DateField()
view
from django.http import JsonResponse
from django.views import View
from book_drf.serializer import BookSerialzier
from books.models import BookInfo
class Books(View):
def get(self,request):
# 1、查询所有图书对象
books = BookInfo.objects.all()
ser = BookSerialzier(books, many=True)
return JsonResponse(ser.data, safe=False)
url
from django.conf.urls import url
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^books_drf/$', views.Books.as_view()),
]
结果展示
[
{
"btitle": "三国演义",
"bread": 89,
"bpub_date": "2021-07-03"
},
{
"btitle": "西游记",
"bread": 99,
"bpub_date": "2021-07-01"
},
{
"btitle": "水浒传",
"bread": 79,
"bpub_date": "2021-05-01"
}
]