You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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序列化器的字段类型验证,让序列化器帮你完成类型转换,同时还能做参数合法性校验:

  1. 修改序列化器,指定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', ...] # 替换为你的实际字段列表
  1. 修改视图,从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:15:37