Django判断表记录存在:all().exists()与exists()哪个是标准写法
Django判断数据表是否存在记录的标准实践结论
直接使用model.objects.exists()是应当遵循的标准写法,model.objects.all().exists()属于无意义的冗余写法,不推荐使用。
- 两者最终执行的数据库查询完全一致:Django QuerySet是懒加载机制,
model.objects.all()仅返回一个未附加任何过滤、排序条件的基础QuerySet实例,不会立刻触发数据库查询;后续调用exists()时,ORM会统一将查询优化为最高效的形式:SELECT (1) AS a FROM 对应数据表 LIMIT 1,加不加.all()不会对SQL执行性能产生任何影响。 - 冗余写法没有存在的必要:Django模型默认的Manager实例(也就是
model.objects)本身就直接提供了exists()方法,其内部实现等价于调用self.get_queryset().exists(),而all()方法的返回值恰好就是self.get_queryset(),额外写.all()属于完全多余的链式调用,只会增加无意义的代码长度。 - 只有当你需要在查询链路中附加其他逻辑时,保留类似
.all()的调用才是合理的,比如model.objects.filter(is_deleted=False).exists()这类带筛选逻辑的写法,不存在多余调用的问题。
社区编码惯例始终倾向于更简洁清晰的写法,无意义的冗余链式调用虽然不会引发功能bug,但在常规代码评审中通常会被要求调整。
内容的提问来源于stack exchange,提问作者Chandragupta Borkotoky
相关产品推荐
相关产品推荐

