Django中in判断字符串存在于查询结果集返回False的原因
问题根因
这个判断失效的核心是你对Django QuerySet的in运算逻辑、以及查询集存储的元素类型理解错了:
posts = Feature.objects.order_by('name')返回的是模型实例的集合,里面存的每一个元素都是Feature类的实例对象,不是单纯的字符串。你写'apple' in posts的时候,程序会逐个拿查询集里的模型对象和字符串'apple'做相等判断,对象和字符串类型完全不同,永远不可能相等,自然永远返回False。- 你执行
print(posts[5])能输出apple,只是因为Feature类定义了__str__魔法方法,打印实例时自动返回了name字段的值做展示,这不代表查询集里存的元素本身就是字符串。 - 额外注意:如果查询集没有提前缓存,直接对QuerySet用
in做判断还会触发一次全表查询,拉取所有符合条件的记录到内存,性能很差。
正确实现方式
如果要判断是否存在name字段值为apple的记录,选下面任意一种写法即可:
- 数据库层过滤判断,性能最优,不需要拉取全量数据:
if posts.filter(name='apple').exists(): print("yes") else: print("no")
- 已经加载全量查询集到内存的场景,明确取实例的name属性做匹配:
if any(post.name == 'apple' for post in posts): print("yes") else: print("no")
内容的提问来源于stack exchange,提问作者Electrocuted
相关产品推荐
相关产品推荐

