Django中is_approved判断异常:if条件始终触发执行求助
问题解决:Django接口is_approved判断逻辑异常
问题根源
你遇到的问题是因为前端传入的is_approved参数是字符串类型(比如"true"或"false"),而Python中所有非空字符串在布尔判断时都会被视为True,所以不管传的是"true"还是"false",都会进入if approved分支。
解决方案
方案1:手动转换字符串为布尔值
直接对request.data里的参数做类型转换,兼容前端传入的字符串格式:
@api_view(['POST']) @permission_classes([IsStaff]) def update_company_info(request): request_qs = CompanyUpdateRequests.objects.filter(id=request.data["request_id"],is_approved=None) # 处理is_approved的类型转换,兼容大小写和空格 approved_str = request.data.get('is_approved', '').strip().lower() approved = approved_str == 'true' serializer = CompanyUpdateRequestSerializer(request_qs[0], data=request.data, partial=True) if serializer.is_valid(): if approved: update_info(request_qs[0].company, request_qs[0]) serializer.save()
方案2:通过序列化器自动处理类型(更规范)
利用DRF序列化器的字段类型验证,让序列化器帮你完成类型转换,同时还能做参数合法性校验:
- 修改序列化器,指定
is_approved为BooleanField:
from rest_framework import serializers class CompanyUpdateRequestSerializer(serializers.ModelSerializer): is_approved = serializers.BooleanField(required=True) class Meta: model = CompanyUpdateRequests fields = ['is_approved', ...] # 替换为你的实际字段列表
- 修改视图,从
serializer.validated_data中取值:
from rest_framework import status from rest_framework.response import Response @api_view(['POST']) @permission_classes([IsStaff]) def update_company_info(request): request_qs = CompanyUpdateRequests.objects.filter(id=request.data["request_id"],is_approved=None) # 处理查询集为空的情况,避免IndexError if not request_qs.exists(): return Response({"error": "请求不存在或已处理"}, status=status.HTTP_404_NOT_FOUND) obj = request_qs.first() serializer = CompanyUpdateRequestSerializer(obj, data=request.data, partial=True) if serializer.is_valid(): # 从验证后的字典中取值,已经是标准布尔类型 approved = serializer.validated_data['is_approved'] if approved: update_info(obj.company, obj) serializer.save() return Response(serializer.data) # 处理参数验证失败的情况 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
额外优化点
当前代码直接取request_qs[0]存在隐患,如果查询集为空会抛出IndexError,建议加上查询集存在性判断,如上方案2所示。
内容的提问来源于stack exchange,提问作者Rohan Abraham
相关产品推荐
相关产品推荐

