viewsets.ModelViewSet代码示例

官网: https://www.django-rest-framework.org/api-guide/viewsets/
viewsets.ModelViewSet自己的拙见:https://blog.csdn.net/weixin_44984864/article/details/107985662

# 密码课程包分类
class CategoryUserPassViewSet(viewsets.ModelViewSet):
    # """
    # 这一viewset提供了`list`, `create`, `retrieve`, `update` 和 `destroy`
    # """
    queryset = Cls_User_Passwd.objects.all()
    serializer_class = CategoryUserPassSerializer
    filter_backends = (filters.DjangoFilterBackend,
                       filters.SearchFilter, filters.OrderingFilter)
	# 查找的字段,请求的接口为:get,加上参数
    filter_fields = ('user_id', 'enterprise_id',)
    permission_classes_by_action = {'list': [AllowAny],
                                    'default': [AllowAny],
                                    'tolead': [StaffPermission],
                                    'check_password': [AllowAny],
                                    'destroy': [StaffPermission], }

    def get_permissions(self):
        try:
            # return permission_classes depending on `action`
            return [permission() for permission in self.permission_classes_by_action[self.action]]
        except KeyError:
            # action is not set return default permission_classes
            return [permission() for permission in self.permission_classes_by_action['default']]

    def get_queryset(self):
        enterprise_id = self.request.GET.get('enterprise_id', None)
        category_id = self.request.GET.get('category_id', 1)
        if not enterprise_id:
            enterprise_id = Enterprise.objects.get(is_local=True).id
        obj = Cls_User_Passwd.objects.filter(
            enterprise_id=enterprise_id, category_id=category_id)
        return obj

	# 此请求是get请求
    def list(self, request, *args, **kwargs):
    	# 加入self.filter_queryset()是因为当get请求时,可以过滤一些查询集
        queryset = self.filter_queryset(
            self.get_queryset()).order_by('-weight')

        # page = self.paginate_queryset(queryset)
        # if page is not None:
        #     serializer = self.get_serializer(page, many=True)
        #     return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

   def update(self, request, pk):
        '''
        更新用户的密码
        :param validated_data:
        :return:
        '''
        # 获取到前端发过来的数据
        post_data = request.POST
        # 将模型Series中字段(类属性)不存在于post_data中的放置在exclude列表中
        exclude = [k for k in post_data.keys() if k not in Series.__dict__.keys()]
        # 转换为字典
        post_data = dict(post_data.items())
        # 将不存在的数据进行清除
        [post_data.pop(k) for k in exclude]
        # 获取到当前要更改的记录
        cls_user_passwd = Cls_User_Passwd.objects.get(pk=pk)

        if post_data.get('password', None):
            cls_user_passwd.password = post_data.get('password', None)
        with transaction.atomic():
            cls_user_passwd.save()
        # 将序列化的数据返回
        cup = CategoryUserPassSerializer(series).data
        return Response(cup, status=status.HTTP_200_OK)


    def destroy(self, request, pk):
        '''
        删除分类
        :param validated_data:
        :return:
        '''
        with transaction.atomic():
            cup = Cls_User_Passwd.objects.get(pk=pk)
            cup.delete()
            return Response('删除成功', status=status.HTTP_200_OK)

    @list_route(methods=['post'])
    def tolead(self, request):
        # 获取到由excel的json数据,或者是单独增加的用户
        # 如果是单独增加的话,会获取到用户的手机号以及密码,由此区分是批量上传还是单个增加
        passwd = request.POST.get('password', None)
        phone = request.POST.get('phone', None)
        category_id = request.POST.get('category_id', None)
        excel_file = request.POST.get('excel_file', None)
        logger.info("excel_file数据为: {}".format(excel_file))
        # 循环获取数据组合数据并写入数据库          password    category   user   enterprise

        try:
            # 控制数据库事务交易
            with transaction.atomic():
                cup_list = []
                logger.info("cup_list数据为: {}".format(cup_list))
                if excel_file:
                    excel_file = json.loads(excel_file)
                    logger.info("excel_file在json话之后数据为: {}".format(excel_file))
                    for data in excel_file:
                        password = generate_verification_code(length=8)
                        logger.info("data数据为: {}".format(data))
                        category_id = data['category_id']
                        category = Category.objects.get(pk=int(category_id))
                        phone = data['phone']
                        # 获取到用户,类型为2的为用户
                        user = UserInfo.objects.filter(
                            tel=phone, type=2).first()
                        if not user:
                            raise Exception('当前%s不是注册用户' % phone)
                        enterprise = category.enterprise
                        mes = {'password': password, 'category': category,
                               'user': user, 'enterprise': enterprise}
                        cup_list.append(mes)
                    data = [Cls_User_Passwd(**item) for item in cup_list]
                    logger.info("data数据为: {}".format(data))
                    cls_user_passwd = Cls_User_Passwd.objects.bulk_create(data)
                else:
                    if not all([passwd, phone, category_id]):
                        raise Exception('请输入完整的数据')
                    else:
                        # 获取到用户
                        user = UserInfo.objects.filter(
                            tel=phone, type=2).first()
                        if not user:
                            raise Exception('当前%s不是注册用户' % phone)
                        category = Category.objects.get(pk=int(category_id))
                        enterprise = category.enterprise
                        cls_user_passwd = Cls_User_Passwd(
                            password=passwd, category=category, user=user, enterprise=enterprise)
                        try:
                            cls_user_passwd.save()
                        except Exception as e:
                            return Response('单独增加用户出现错误: %s' % e)

        except IntegrityError:
            return Response('有重复数据被加入数据库')
        except Exception as e:
            return Response('发生以下错误:%s' % e)
        return Response('入库成功', status=status.HTTP_200_OK)

    @detail_route(methods=["get"])
    def check_password(self, request, pk):
        '''
        点击报名以及发送密码接口
        点击报名,仅限于分类类型为3的,才会调用此接口
        '''
        message = {}
        # 当前登录用户
        user = request.user
        # 获取当前登录用户userinfo
        user_info = UserInfo.objects.get(owner=user)
        password = request.GET.get('password', None)
        category_id = pk
        enterprise_id = self.request.GET.get('enterprise_id', None)
        if not enterprise_id:
            enterprise_id = Enterprise.objects.get(is_local=True).id
        cls_user_passwd = Cls_User_Passwd.objects.filter(
            category_id=category_id, user=user_info, enterprise_id=enterprise_id).first()
        if not cls_user_passwd:
            message['code'] = 403
            message['message'] = '没有权限观看此分类下的视频,赶快联系客服小姐姐吧'
            return Response(message)
        cls_user_passwd_activ_status = cls_user_passwd.activ_status
        if int(cls_user_passwd_activ_status) == 1:
            # 203状态码 当前用户已经激活,可以不用输入密码
            message['code'] = 203
            message['message'] = '当前用户已经激活此分类下的课程'
            return Response(message)

        if not password:
            message['code'] = 204
            message['message'] = '请输入密码'
            return Response(message)
        course_password = cls_user_passwd.password
        if not course_password:
            message['code'] = 205
            message['message'] = '该课程不需要密码'
            return Response(message)
        logger.info("s_pwd:{},type{},c_pwd{},type{}".format(course_password,
                                                            type(course_password), password, type(password)))
        try:
            # 控制事务
            with transaction.atomic():
                if course_password == password:
                    cls_user_passwd.activ_status = 1
                    cls_user_passwd.save()
                    message['code'] = 200
                    message['message'] = '密码正确'
                    return Response(message)
                else:
                    message['code'] = 201
                    message['message'] = '密码错误'
                    return Response(message)
        except:
            message['code'] = 206
            message['message'] = '未知错误,请联系管理员'
            return Response(message)


    @detail_route(methods=["get"])
    def make_password(self, request, pk):
        '''
        生成8位数字加字母密码
        '''
        message = {}
        password = generate_verification_code(length=8)
        message['password'] = password
        return Response(message,status=status.HTTP_200_OK)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值