django rest framework 自定义ModelViewSet的返回内容

news/2025/2/19 10:27:35

django rest framework的ModelViewSet非常爽,省了一大堆业务逻辑代码,跟自己手写restful的API 比至少减了100多行代码,而且serializer这种东西都是复制就行,少耗费好多脑细泡。create和update的时候的各种异常根本不用自己检查,直接就能报出来,加上django的国际化功能,直接甩中文,贼轻松,类似这样:

{
    "name": [
        "具有 人物名称 的 人物 已存在。"
    ],
    "category": [
        "列表不能为空。"
    ]
}

配合rest framework的Response和status,根据http状态码判断返回状态然后直接读取数据体,非常方便。不过和前端配合的话,需要返回code和msg,所以要自定义一下返回内容。根据serializer.errors的情况就可以判断返回是否异常,这样可以从return Response的地方做个修改就可以把所有返回内容都加上code和msg了,不用每个return都写。

如果serializer.errors有值,就是报错了,就返回

{'code': 0, 'msg': '失败', 'data': serializer.errors}

如果没报错,就返回

{'code': 1, 'msg': '成功', 'data': serializer.data}

既然所有Response都要调整,最好当然直接改Response,一看源码,还防着我这手儿,不让传serializer,只让传serializer.data:

if isinstance(data, Serializer):
    msg = (
        'You passed a Serializer instance as data, but '
        'probably meant to pass serialized `.data` or '
        '`.error`. representation.'
    )
    raise AssertionError(msg)

虽然仍然可以改,不过这个Response的位置太根部了,除非改源码,否则改了Response,所有return Response的地方都要改。那就换个思路,改ModelViewSet吧。

ModelViewSet直接继承了6个父类:

class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    A viewset that provides default `create()`, `retrieve()`, `update()`,
    `partial_update()`, `destroy()` and `list()` actions.
    """
    pass

只要调整那几个混入类里面的对应的方法的return Response就可以了。以update为例:

class MyModelViewSet(viewsets.ModelViewSet):
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        is_valid = serializer.is_valid(raise_exception=False)
        #######
        if not is_valid:
            return Response({'code': 0, 'msg': '失败', 'data': serializer.errors})
        self.perform_update(serializer)
        ######
        if getattr(instance, '_prefetched_objects_cache', None):
            # If 'prefetch_related' has been applied to a queryset, we need to
            # forcibly invalidate the prefetch cache on the instance.
            instance._prefetched_objects_cache = {}

        return Response({'code': 1, 'msg': '成功', 'data': serializer.data})

注意is_valid = serializer.is_valid(raise_exception=False)源码是raise_exception=True,要改成False,不然就抛出异常在serializer里处理,不走下面的代码了。

然后只要在继承ModelViewSet的地方改为继承MyModelViewSet就ok了。

文章来源:https://blog.csdn.net/qq_35753140/article/details/90026423
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.niftyadmin.cn/n/1531909.html

相关文章

java代码静态分析工具

需求&#xff1a;有些基础类型的遍历&#xff0c;值希望它被赋予指定的几个值&#xff0c;赋予其他值能够别编译器&#xff08;IDEA/eclipse&#xff09;提醒 Android studu结合自己的插件&#xff0c;引入 <!-- https://mvnrepository.com/artifact/com.android.support/su…

django rest framework 自定义分页

上回书说到自定义返回内容&#xff0c;通过继承viewsets.ModelViewSet实现&#xff0c;这里面有个问题&#xff0c;在list函数&#xff0c;也就是返回结果列表这个功能里&#xff0c;如果用到了分页&#xff0c;就需要额外的调整来实现自定义返回内容了。 def list(self, reque…

django rest framework 自定义过滤器 django filter

django filter通过url传参实现资源的筛选、搜索、排序等功能&#xff0c;省着自己写从request.query_params获取参数然后Order.objects().filter()了。 首先安装django-filter pip install django-filter在视图文件&#xff08;view.py&#xff09;中自定义过滤器类 import …

django vs flask 负载性能测试对比,谁更快(一)GET简单json

读数据库性能在这里 先上结果&#xff1a; 完整的django初始框架&#xff0c;开发服务器&#xff1a;390 rps单文件django&#xff0c;开发服务器&#xff1a; 406 rps单文件flask&#xff0c;开发服务器&#xff1a;423 rps完整的django初始框架&#xff0c;gunicorn&#x…

技术决定成败:灾备系统建设的六大要素

容灾技术是灾备系统的核心&#xff0c;技术因素考虑的是否完善&#xff0c;对于灾备系统建设的成败可以说起到非常关键的作用。如果灾备方案提供商在企业灾备建议之初&#xff0c;能从企业切实的容灾系统技术和工程可行性出发&#xff0c;为企业找出最佳的灾备系统建设路线&…

django vs flask 负载性能测试对比,谁更快(二)读数据库

上文书对比了二者简单GET json的性能 网上有篇16年的对比文章说django ORM性能要比flask sqlalchemy差&#xff0c;我简单对比了一下读数据库的效率。 环境说明 flask 1.0.2&#xff0c;Flask-SQLAlchemy 2.4.0&#xff0c; SQLAlchemy 1.3.3&#xff0c;一个app文件&#x…

认识BLAS

*****BLAS的安装*****转载于:https://www.cnblogs.com/AngelLee/p/4205523.html

MySQL基础-2

目录 配置文件的使用表的分类——数据库引擎简单的表的增删改查(CRUD)创建表的完整写法Mysql中的数据类型数字类型字符串类型枚举和集合时间和日期配置文件的使用 大家发现每次进入mysql都需要进行登录操作&#xff0c;而且服务器的编码为Latin1&#xff0c;客户端的编码为GBK&…