Django QuerySet条件判断始终不成立的原因及解决方法
这个问题我之前也碰到过,核心是没搞清楚Django QuerySet和普通字符串/列表的区别,咱们一步步拆解:
首先说为啥你的条件判断永远不成立:
你用values_list('sr_datareduce_summary_code')得到的是一个Django QuerySet对象,它本质是类似列表的可迭代集合,里面的元素是元组(比如('Z07126',)),而不是单个字符串。你直接把整个集合和字符串"Z07126"比较,就像拿一篮子苹果和单个苹果比,肯定永远不相等。
另外提一句,你之前定义currentlevel的时候有个语法小错误:ntname = 'owner.employeentname多了个单引号,应该写成ntname=owner.employeentname(去掉引号),不过你后面的条件判断里写对了,应该是笔误。
下面给你两种正确的实现方式,按需选择:
方式一:用exists()判断(推荐,性能最优)
如果你的需求只是判断是否存在符合条件的记录,不需要获取所有的sr_datareduce_summary_code值,直接用exists()是最高效的——它只会执行一条EXISTS SQL语句,不会查询所有数据:
# 直接过滤出符合所有条件的记录,判断是否存在 has_access = QVReportAccess.objects.filter( ntname=owner.employeentname, active=1, sr_datareduce_summary_code="Z07126" ).exists() appaccess = 'yes' if has_access else 'no' print(appaccess)
方式二:用values_list配合flat=True判断
如果你需要先获取所有的sr_datareduce_summary_code值再判断,记得加上flat=True参数,它会让values_list返回单个字符串的迭代器(而不是元组),然后用in判断目标值是否在其中:
# 用flat=True得到纯字符串的QuerySet code_list = QVReportAccess.objects.filter( ntname=owner.employeentname, active=1 ).values_list('sr_datareduce_summary_code', flat=True) # 判断目标值是否在集合中 appaccess = 'yes' if "Z07126" in code_list else 'no' print(appaccess)
补充说明
如果你不想处理重复值,可以把QuerySet转成集合(set(code_list))自动去重,但对于“是否存在”的判断来说,重复值不影响结果,所以没必要额外处理。
内容的提问来源于stack exchange,提问作者user1470034

