Django中BooleanField指定布尔值筛选异常及正确实现问询
关于Django BooleanField 查询的两个问题解答
1. 如何获取所有BooleanField字段值为False的数据行?
有几种简单直接的方式可以实现:
直接过滤字段等于False:这是最直观的写法,Django会自动把布尔值转换成对应的SQL查询:
# 假设字段名为is_published books = Book.objects.filter(is_published=False)使用exclude反向过滤:如果你习惯从"排除不符合条件"的角度思考,也可以排除值为True的行:
books = Book.objects.exclude(is_published=True)使用Q对象(复杂场景):如果需要和其他条件组合查询,Q对象会很有用:
from django.db.models import Q books = Book.objects.filter(Q(is_published=False) & Q(author__name="John"))
2. 解决BooleanField __in 查询异常的问题
你遇到的问题根源在于:你传递给__in的是字符串类型的'False'/'false',而Python中非空字符串会被解析为布尔值True,所以Django最终生成的SQL会变成fieldName in (True),这完全不是你想要的结果。
正确的做法是直接传递布尔值的列表,而不是字符串。修改你的字典定义即可:
# 错误写法:用了字符串 # book_dict = {'fieldName__in': 'False'} # 正确写法:传递布尔值列表 book_dict = {'fieldName__in': [False]}
如果你的需求是查询值为True或False的所有行(其实就是查询所有行,因为布尔字段只有这两个值),那其实根本不需要__in,直接去掉这个过滤条件就行,或者写成:
book_dict = {'fieldName__in': [True, False]}
修改后你的完整查询代码应该是这样的:
books = Book.objects.filter(**book_dict).prefetch_related(prefetch).select_related('book_pdf', 'book__pdf_file').distinct('id')
另外补充一点:Django的ORM对布尔值的处理是严格对应SQL中的布尔类型(或者数据库等价的tinyint等),所以一定要传递Python的True/False对象,而不是字符串或其他类型,避免类型转换导致的意外结果。
内容的提问来源于stack exchange,提问作者Daniel Illouz
相关产品推荐
相关产品推荐

