Django中不新增自定义模型管理器如何重写模型的get_queryset方法?
Django Slot模型自动过滤NULL state实现方案
核心思路
将带过滤逻辑的自定义管理器设为默认的objects管理器,原有全量查询能力通过重命名的独立管理器保留,无需修改任何现有业务调用代码。
完整实现代码
# 自定义带过滤逻辑的管理器 class NonNullStateSlotManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(state__isnull=False) # 改造后的Slot模型 class Slot(models.Model): # 补充null=True适配允许NULL的需求(原有代码缺少该配置) state = models.CharField(max_length=20, choices=SLOT_STATE, default=SLOT_STATE[0][0], null=True) # 第一位声明的管理器为默认管理器,原有所有调用Slot.objects的代码无需修改 objects = NonNullStateSlotManager() # 保留全量查询能力,需要查询含state为NULL的记录时调用 all_objects = models.Manager()
注意事项
- 现有所有使用
Slot.objects的业务代码无需任何调整,自动生效state非NULL的过滤规则 - 关联查询、
get_object_or_404等Django内置快捷方法都会默认使用带过滤规则的管理器,符合预期 - 若需要查询包含state为NULL的全量记录,直接调用
Slot.all_objects即可
内容的提问来源于stack exchange,提问作者raj-kapil
相关产品推荐
相关产品推荐

