Django设置不同用户组提现限额时ValueError报错如何修复?
问题原因
- 你的
aggregate(Sum('amount'))返回的是字典结构,格式为{"amount__sum": 累计提现金额/None},你直接遍历该字典时,遍历的是字典的key(也就是字符串amount__sum),尝试把这个字符串转float就会触发你遇到的报错。 - 原有逻辑只有限额阈值的比较表达式,没有判断超出后抛出异常的逻辑,等于校验完全不生效。
- 你定义的UserRole枚举里没有
diamond角色,只有platinum、vip,原代码的角色判断和实际枚举不匹配。 - 没有处理24小时内无提现记录时
amount__sum为None的情况,会触发空值报错。 - 现有逻辑只统计了已提交的提现金额,没有加上本次要申请的提现金额,校验逻辑不完整。
修复后代码
from django.db.models import Sum from django.utils import timezone from rest_framework.exceptions import ValidationError @api_view(['POST']) @permission_classes([IsAuthenticated, HasWhitelistedIp]) def check_withdrawal_limit(request): data = request.data # 先校验必要参数 if not data.get("user_id") or not data.get("apply_amount"): raise ValidationError("缺少用户ID或本次申请提现金额参数") # 用Django自带的时区感知时间,避免时区错误 time_24_hours_ago = timezone.now() - timezone.timedelta(days=1) user = User.objects.get(id=data["user_id"]) # 统计24小时内有效提现总金额,过滤掉已拒绝的提现,可根据业务需求调整状态范围 total_withdraw = user.withdrawrequest_set.filter( created_at__gte=time_24_hours_ago, status__in=[ WithdrawRequest.WithdrawStatus.PENDING, WithdrawRequest.WithdrawStatus.PROCESSING, WithdrawRequest.WithdrawStatus.PROCESSED ] ).aggregate(total=Sum('amount'))['total'] or 0.0 # 定义角色对应的24小时提现限额,和UserRole枚举一一对应 role_limit_map = { User.UserRole.REGULAR: 250, User.UserRole.SILVER: 500, User.UserRole.GOLD: 1000, User.UserRole.PLATINUM: 2500, User.UserRole.VIP: 10000 # VIP限额可根据业务需求调整 } # 获取当前用户的限额 limit = role_limit_map.get(user.role) if not limit: raise ValidationError("用户角色异常,无法查询提现限额") # 计算已提现+本次申请的总金额,判断是否超出限额 apply_amount = float(data.get("apply_amount")) if total_withdraw + apply_amount > limit: raise ValidationError(f"您已超出24小时提现限额,当前角色限额为{limit}元,24小时内已提现{total_withdraw}元,还可提现{round(limit - total_withdraw, 2)}元") return Response({ "total_withdraw_24h": total_withdraw, "limit": limit, "available_withdraw": round(limit - total_withdraw, 2), "pass_check": True })
额外优化建议
- 如果是用户端接口,建议直接取
request.user代替前端传的user_id,避免越权查询其他用户的限额 - 可以把限额配置放到项目settings或者后台动态配置表中,后续调整限额不需要修改代码
内容的提问来源于stack exchange,提问作者Bulba
相关产品推荐
相关产品推荐

