里面有自定义的更新策略,

序列化时,考虑nest及显示。

很有参考意义。

然后,前端,可以考虑用angular.js或vue.js实现。

每次以token进行认证。

url.py

router = DefaultRouter()
router.register(r'subserver', api_views.SubserverViewSet, base_name="subserver")
router.register(r'deploypool', api_views.DeployPoolViewSet, base_name="deploypool")
router.register(r'versionpool', api_views.VersionPoolViewSet, base_name="versionpool")
router.register(r'users', api_views.UserViewSet, base_name="users")
router.register(r'server', api_views.ServerViewSet, base_name="server")
router.register(r'site', api_views.SiteViewSet, base_name="site")
router.register(r'app', api_views.AppViewSet, base_name="app")

serializers.py

class UserSerializer(serializers.HyperlinkedModelSerializer):
    deploy_create_user = serializers.HyperlinkedRelatedField(many=True, view_name='api:deploypool-detail', read_only=True)

    class Meta:
        model = User
        fields = ('id', 'username', 'deploy_create_user',)

class TokenSerializer(serializers.ModelSerializer):
    token = serializers.ReadOnlyField(source='create_user.username')

    class Meta:
        model = User
        fields = ('id', 'username', 'code', 'linenos', 'language', 'style')

class ServerSerializer(serializers.HyperlinkedModelSerializer):
    ip_subserver = serializers.HyperlinkedRelatedField(many=True, view_name='api:subserver-detail', read_only=True)
    # app_name = serializers.ReadOnlyField(source='app_name.name')

    class Meta:
        model = Server
        fields = ('id', 'server_env', 'name', 'server_sys', 'ip_subserver')

class SubserverSerializer(serializers.HyperlinkedModelSerializer):
    app_name = serializers.HyperlinkedRelatedField(view_name='api:app-detail', read_only=True)
    # server_ip = serializers.ReadOnlyField(source='server_ip.name')

    class Meta:
        model = SubServer
        fields = ('id', 'deploy_status', 'app_name', )

class SiteSerializer(serializers.HyperlinkedModelSerializer):
    app_name = serializers.HyperlinkedRelatedField(many=True, view_name='api:app-detail', read_only=True)

    class Meta:
        model = Site
        fields = ('id', 'name', 'app_name')

class SiteListSerializer(serializers.ModelSerializer):

    class Meta:
        model = Site
        fields = ('id', 'name')

class DeployPoolSerializer(serializers.ModelSerializer):
    create_user = serializers.ReadOnlyField(source='create_user.username')
    site_name = serializers.ReadOnlyField(source='site_name.name')
    version_name = serializers.ReadOnlyField(source='version_name.name')
    app_name = serializers.ReadOnlyField(source='app_name.name')

    class Meta:
        model = DeployPool
        fields = ('id', 'name', 'site_name', 'version_name', 'app_name',
                  'order_no', 'deploy_status', 'deploy_progress', 'create_user', 'change_date' )

class AppSerializer(serializers.HyperlinkedModelSerializer):
    site_app = serializers.HyperlinkedRelatedField(many=True, view_name='api:site-detail', read_only=True)

    class Meta:
        model = SubServer
        fields = ('id', 'name', 'site_app',)

class VersionPoolSerializer(serializers.ModelSerializer):
    # 注意外键名称显示,nest field显示时的配置
    site_name = serializers.ReadOnlyField(source='site_name.name')
    dep_version = DeployPoolSerializer(many=True, required=False, read_only=True)
    create_user = serializers.ReadOnlyField(source='create_user.username')

    class Meta:
        model = VersionPool
        fields = ('id', 'name', 'site_name', 'is_order', 'version_progress',  'dep_version', 'create_user', 'add_date')

views.py

@csrf_exempt
def gettoken():
    pass

class UserViewSet(viewsets.ReadOnlyModelViewSet):
    """
    This viewset automatically provides `list` and `detail` actions.
    """
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (permissions.AllowAny,)
    paginate_by = 10

    def get_queryset(self):
        queryset = self.queryset.filter(username='kevin')
        return queryset

class SiteViewSet(viewsets.ReadOnlyModelViewSet):
    """
    This viewset automatically provides `list` and `detail` actions.
    """
    queryset = Site.objects.all()
    serializer_class = SiteSerializer
    permission_classes = (permissions.AllowAny,)
    paginate_by = 10

class SiteListAPI(generics.ListAPIView):
    """
    This ListAPIView automatically provides `list` actions.
    """
    queryset = Site.objects.all()
    serializer_class = SiteListSerializer
    paginate_by = 1000

class AppViewSet(viewsets.ReadOnlyModelViewSet):
    """
    This viewset automatically provides `list` and `detail` actions.
    """
    queryset = App.objects.all()
    serializer_class = AppSerializer
    permission_classes = (permissions.AllowAny,)
    paginate_by = 10

class ServerViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list` and `detail` actions.
    """
    queryset = Server.objects.all()
    serializer_class = ServerSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, )
    paginate_by = 10

class SubserverViewSet(viewsets.ReadOnlyModelViewSet):
    """
    This viewset automatically provides `list`, `create`, `retrieve`,
    `update` and `destroy` actions.

    Additionally we also provide an extra `highlight` action.
    """
    queryset = SubServer.objects.all()
    serializer_class = SubserverSerializer
    permission_classes = (permissions.AllowAny,)
    paginate_by = 10

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

class DeployPoolViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list`, `create`, `retrieve`,
    `update` and `destroy` actions.

    Additionally we also provide an extra `highlight` action.
    """
    serializer_class = DeployPoolSerializer
    authentication_classes = (TokenAuthentication,)
    paginate_by = 1000

    def get_queryset(self):
        filter_dict = dict()

        if self.request.query_params.get('site_name'):
            filter_dict['site_name__name'] = self.request.query_params.get('site_name')
        if self.request.query_params.get('order_no'):
            filter_dict['order_no'] = self.request.query_params.get('order_no')
        if self.request.query_params.get('version_name'):
            if self.request.query_params.get('version_name') == "null":
                filter_dict['version_name__isnull'] = True
            else:
                filter_dict['version_name__name'] = self.request.query_params.get('version_name')
        # 以下过滤发布单的环境及时间(30天)
        # filter_dict['deploy_progress'] = u"待发布"
        filter_dict['deploy_status__in'] = ["UAT", "PRD", "SIM", "DRP", "BUILD", "FAT", "DEV"]
        current_date = timezone.now()
        filter_dict['change_date__gt'] = current_date - timedelta(days=3000)

        return DeployPool.objects.filter(**filter_dict)

    def update(self, request, *args, **kwargs):
        name = request.data['name']
        order_no = request.data['order_no']
        version_name = request.data['version_name']

        try:
            if version_name:
                version_item = VersionPool.objects.get(name=version_name)
                DeployPool.objects.filter(name=name).update(order_no=order_no, version_name=version_item)
            else:
                DeployPool.objects.filter(name=name).update(order_no=order_no, version_name=None)
            response_data = {
                'result': 'success',
                'name': name,
                'create_user': request.user.username,
                'message': '更新发布单成功!'
            }
            return Response(response_data, status=status.HTTP_201_CREATED)
        except:
            response_data = {
                'result': 'failed',
                'message': '更新发布单失败!'
            }
            return Response(response_data, status=status.HTTP_400_BAD_REQUEST)

class VersionPoolViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list`, `create`, `retrieve`,
    `update` and `destroy` actions.

    Additionally we also provide an extra `highlight` action.
    """
    queryset = VersionPool.objects.all()
    serializer_class = VersionPoolSerializer
    authentication_classes = (TokenAuthentication,)
    paginate_by = 100

    def get_queryset(self):
        queryset = self.queryset
        return queryset

    # 如有需要,自定义update和create方法,以实现外键方面的关联
    def create(self, request, *args, **kwargs):
        name = request.data['name']
        site_name = request.data['site_name']
        validated_data = dict()
        validated_data['name'] = site_name + "-" + name
        try:
            validated_data['site_name'] = Site.objects.get(name=site_name)
        except:
            response_data = {
                'result': 'failed',
                'name': site_name + "-" + name,
                'create_user': request.user.username,
                'message': '项目名不存在!'
            }
            return Response(response_data, status=status.HTTP_400_BAD_REQUEST)
        validated_data['create_user'] = request.user
        try:
            VersionPool.objects.create(**validated_data)
            response_data = {
                'result': 'success',
                'name': site_name + "-" + name,
                'create_user': request.user.username,
                'message': '创建版本单成功!'
            }
            return Response(response_data, status=status.HTTP_201_CREATED)
        except:
            response_data = {
                'result': 'failed',
                'name': site_name + "-" + name,
                'create_user': request.user.username,
                'message': '已存在相同版本单'
            }
            return Response(response_data, status=status.HTTP_400_BAD_REQUEST)

    def update(self, request, *args, **kwargs):

        if request.data["isOrder"] == "false":
            is_order = False
        else:
            is_order = True

        print request.data, "%%%%%%%%%%%%%%%%%%%%%%%%%"

        VersionPool.objects.filter(id=kwargs["pk"]).update(is_order=is_order)

        try:
            response_data = {
                'result': 'success',
                'create_user': request.user.username,
                'message': '更新版本单成功!'
            }
            return Response(response_data, status=status.HTTP_201_CREATED)
        except:
            response_data = {
                'result': 'failed',
                'message': '更新版本单失败!'
            }
            return Response(response_data, status=status.HTTP_400_BAD_REQUEST)

django rest_framework比较完整的自定义实现样例的更多相关文章

  1. 【转】k8s集群自定义clusterRole样例

    对pod资源可以删除,进入终端执行命令,其他资源只读权限 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: an ...

  2. 通过Canvas及File API缩放并上传图片完整演示样例

    创建一个只管的用户界面,并同意你控制图片的大小.上传到server端的数据,并不须要处理enctype为 multi-part/form-data 的情况.只一个简单的POST表单处理程序就能够了. ...

  3. Android之——多线程下载演示样例

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载.Android API中明 ...

  4. python之Django rest_framework总结

    一.rest api    a.api就是接口         如: - http://www.oldboyedu.com/get_user/                - http://www. ...

  5. Django rest_framework 实用技巧

    前言: 最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用 ...

  6. 七、django rest_framework源码之视图

    1 绪言 当大家看大这篇博文的时候,应该对Django rest_framework中的CBV有所了解了,大致来说就是通过定义类来继承APIView类,并在类中定义get.post.put.delet ...

  7. 四、django rest_framework源码之频率控制剖析

    1 绪言 权限判定之后的下一个环节是访问频率控制,本篇我们分析访问频率控制部分源码. 2 源码分析 访问频率控制在dispatch方法中的initial方法调用check_throttles方法开始. ...

  8. 二、django rest_framework源码之认证流程剖析

    1 绪言 上一篇中讲了django rest_framework总体流程,整个流程中最关键的一步就是执行dispatch方法.在dispatch方法中,在调用了一个initial方法,所有的认证.权限 ...

  9. CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境, 记坑篇

    CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境 CentOS7 + Python3 + D ...

随机推荐

  1. 【arc080F】Prime Flip

    Portal --> arc080_f Solution ​  这题的话..差分套路题(算吗?反正就是想到差分就很好想了qwq) ​​  (但是问题就是我不会这种套路啊qwq题解原话是:&quo ...

  2. 据说要写一个CTSC&APIO的收获

    就不写流水帐了,总的写一下吧.先从最浅显的地方开始——知识.大概被普及了一发带花树,算上自己的考试,还被普及了一发洲阁筛.当然更多的还是对于一些知识的强化,比如:乱搞(这东西真是太重点了啊).DP.数 ...

  3. c/c++中的预编译指令总结

    预处理指令提供按条件跳过源文件中的节.报告错误和警告条件,以及描绘源代码的不同区域的能力.使用术语“预处理指令”只是为了与 C 和 C++ 编程语言保持一致.在 C# 中没有单独的预处理步骤:预处理指 ...

  4. php 修改图片分辨率

    <?php function resize_image($file, $w, $h, $crop=FALSE) { list($width, $height) = getimagesize($f ...

  5. Bolt XML和JQBolt Lua代码自动补全插件配置教程

    Bolt没有提供官方IDE,缺少强大的代码提示和自动补全,Notepad++写起界面和脚本来比较费劲. Notepad++有个QuickText插件,支持多语言的自动补全,进行简单的配置就可以支持Bo ...

  6. C++对象与其第一个非静态成员地址相同

    由于对象的内存空间里是按顺序依次存储了它的非静态成员变量,因此对象和它的第一个非静态成员变量的地址是相同的: class A { private: int i; } int main() { A a; ...

  7. 如何在WIndows电脑上安装 SVN Server 实现代码版本控制

    One 下载-安装 SVN SVNServer  先去官网下载服务器版本的svn server,下载地址 :https://www.visualsvn.com/server/download/   选 ...

  8. SSM框架使用-wrong

    mybatis手册 1. mybatis 绑定错误 如果出现: org.apache.ibatis.binding.BindingException: Invalid bound statement ...

  9. Integer Numbers

    ZOJ Problem Set - 3365 Integer Numbers Time Limit: 1 Second      Memory Limit: 32768 KB      Special ...

  10. constant value too large

    出错现场: .model small .data byte_var dw dup(-, dup()) .stack .code 将byte_var dw 'abc',10h,2 dup(-1,2 du ...