DRF | 使用GenericAPIView增删改查实例

模型层 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

  1. CreateModelMixin:新增
  2. RetrieveModelMixin:查单一数据
  3. ListModelMixin:查所有数据
  4. UpdateModelMixin:修改数据
  5. 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值