模型层 model.py文件
我这里继承了公共基类,这里就不写了
class News(Base):
objects = None
pic = models.CharField(verbose_name='缩略图', max_length=500, blank=True)
category = models.ForeignKey('Category', blank=True, verbose_name='栏目分类', on_delete=models.CASCADE)
tags = models.ManyToManyField('Tag', blank=True, verbose_name='AG标签')
news_text = RichTextUploadingField(verbose_name='正文内容')
class Meta:
# db_table = 'water_article'
verbose_name_plural = "文章资讯"
verbose_name = '内容'
def __str__(self):
return self.title
路由 urls.py
1、先创建urls路由,记得导包(模型)
urlpatterns = [
path('cat/', Cat.as_view(), name='cat_api')
]
序列化器 seralizer.py
单独创建一个seralizer.py作为序列化器文件,这里我用的是ModelSerializer ,ModelSerializer是Serializer的子类
# 导入DRF的序列化器包文件
from rest_framework import serializers
# 创建自定义名序列化器类
class NewModelSerializers(serializers.ModelSerializer):
class Meta:
# 序列化的模型
model = News
# 序列化全部字段
fields = "__all__"
如果想排除、自定义序列化字段修改fields属性,具体参考我之前写的一篇文章【Mate元类属性方法使用】
视图 views.py文件
查所有 列表视图
class BaiduListApi(GenericAPIView):
"""
列表视图——Api
"""
# 指定序列化器类
serializer_class = NewModelSerializers
# 查询模型数据(查所有)
queryset = News.objects.all()
def get(self, request):
"""
查所有数据
:param request:
:return:
"""
# 查询数据之后调用内部方法
qs = self.get_queryset()
# 模型数据进行序列化(查所有需要指定many=True,不然会报错)
serializer = self.get_serializer(qs, many=True)
# 返回所有序列化数据给前端
return Response(serializer.data)
def post(self, request):
"""
新增数据
:param request:
:return:
"""
# 获取前端传入的数据
q = request.data
# 创建序列化器,并传递参数
serializer = NewModelSerializers(data=q)
# 验证数据,数据不对就报错
serializer.is_valid(raise_exception=True)
# 插入数据库
serializer.save()
return Response(serializer.data)
pass
查询单一 详情视图
class BaiduDetailApi(GenericAPIView):
"""
详情视图——Api
"""
# 指定序列化器类
serializer_class = NewModelSerializers
# 查询模型数据(查所有)
queryset = News.objects.all()
def get(self, request, pk):
"""
查询单一数据
:param request:
:param pk:
:return:
"""
# 查询单一数据方法get_object(),只需要get方法传入PK值
q = self.get_object()
# 模型单一数据进行序列化
serializer = self.get_serializer(q)
# 返回单一数据序列化后给前端
return Response(serializer.data)
def put(self, request, pk):
"""
修改单一数据
:param request:
:param pk:
:return:
"""
q = self.get_object()
# 单一数据查询,前端传过来的数据data 修改
serializer = self.get_serializer(q, data=request.data)
# 数据校验,raise_exception=True异常扑获
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
def delete(self, request, pk):
"""
删除单一数据
:param request:
:param pk:
:return:
"""
# 获取单一数据
q = self.get_object()
# 直接删除数据库中的数据(物理删除)
q.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
pass
GenericAPIView和 Minxin混合使用的高级用法
model.py seralizer.py urls.py都不变,只修改views.py视图
扩展视图高级用法 views.py文件
需要导入minxins扩展包from rest_framework.mixins import CreateModelMixin,RetrieveModelMixin,ListModelMixin,UpdateModelMixin,DestroyModelMixin
- CreateModelMixin:新增
- RetrieveModelMixin:查单一数据
- ListModelMixin:查所有数据
- UpdateModelMixin:修改数据
- DestroyModelMixin:删除数据
查所有 列表视图
class BaiduListApi(CreateModelMixin,ListModelMixin,GenericAPIView):
"""
列表视图——Api
"""
# 指定序列化器类
serializer_class = NewModelSerializers
# 查询模型数据(查所有)
queryset = News.objects.all()
def get(self, request):
"""
查所有数据
:param request:
:return:
"""
return self.list(request)
def post(self, request):
"""
新增数据
:param request:
:return:
"""
return self.create(request)
pass
查询单一 详情视图
class BaiduDetailApi(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
“”"
详情视图——Api
“”"
# 指定序列化器类
serializer_class = NewModelSerializers
# 查询模型数据(查所有)
queryset = News.objects.all()
def get(self, request, pk):
"""
查询单一数据
:param request:
:param pk:
:return:
"""
return self.retrieve(request, pk)
def put(self, request, pk):
"""
修改单一数据
:param request:
:param pk:
:return:
"""
return self.update(request, pk)
def delete(self, request, pk):
"""
删除单一数据
:param request:
:param pk:
:return:
"""
return self.destroy(request, pk)
pass