如何在Django Shell中查询模型内is_active为False的数据?
排查与解决方案
第一步:确认库中是否真的存在
is_active=False的记录
先执行下面的代码统计所有is_active字段的取值分布,确认是否真的存在值为False的条目:from django.db.models import Count model.objects.values('is_active').annotate(count=Count('id'))如果返回结果中没有
is_active=False的条目,说明库里确实没有符合条件的数据,返回空查询集属于正常结果。第二步:检查模型是否配置了带过滤逻辑的默认管理器
很多Django项目会自定义默认管理器,默认过滤掉已禁用的记录,示例配置如下:class CustomManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(is_active=True) class YourModel(models.Model): is_active = models.BooleanField(default=True) # 替换了默认的objects管理器 objects = CustomManager()这种场景下默认的
objects管理器已经提前过滤了所有is_active=False的记录,自然无法查询到目标数据。
修复方案:给模型新增一个无过滤的全量管理器,之后用该管理器查询即可:# 模型定义新增全量管理器 class YourModel(models.Model): is_active = models.BooleanField(default=True) objects = CustomManager() all_objects = models.Manager() # 全量数据管理器查询代码调整为:
queryset = model.all_objects.filter(is_active=False) queryset.count()第三步:确认数据库连接是否正确
执行下面的代码查看当前Django Shell连接的数据库名称,确认和你预期存储了目标数据的数据库一致,避免多环境串库的问题:from django.db import connection print(connection.settings_dict['NAME'])第四步:确认字段名拼写无误
执行下面的代码查看模型所有字段名,确认你使用的is_active字段真实存在,避免拼写错误:print([f.name for f in model._meta.get_fields()])
内容的提问来源于stack exchange,提问作者Pinklesh Parjapati
相关产品推荐
相关产品推荐

