Django测试时如何跳过无对应数据表的虚拟模型引发的报错?
报错原因
你自定义的StatisticModel继承了Django的models.Model,默认受Django ORM管理,执行测试流程时Django会自动校验该模型关联的数据库表是否存在,你没有创建对应表就会触发该报错。
解决方案
- 方案1:给虚拟模型添加
managed = False配置
在StatisticModel的Meta类中新增managed = False属性,明确告知Django不要为这个模型生成数据库表、也不做表结构相关的校验,修改后代码如下:
class StatisticModel(models.Model): class Meta: verbose_name_plural = 'Statistic' managed = False # 新增该行配置
- 方案2:重写Admin类的相关方法,避免触发数据库查询
默认的ModelAdminchangelist页面会尝试查询模型的数据库数据,即便添加了managed = False配置也可能触发查询报错,因此需要重写Admin的权限和查询相关方法,跳过默认的数据库查询逻辑:
class StatisticModelAdmin(admin.ModelAdmin): model = StatisticModel def get_urls(self): view_name = 'changelist' return [ path('settings/', my_custom_view, name=view_name), ] # 禁用默认的增删改权限,避免触发数据库操作 def has_add_permission(self, request): return False def has_change_permission(self, request, obj=None): return False def has_delete_permission(self, request, obj=None): return False def has_view_permission(self, request, obj=None): # 仅给自定义的settings页面开放查看权限,不触发默认列表查询 return request.path.endswith('/settings/')
- 方案3:不继承
models.Model,直接注册无模型的Admin页面
如果你的自定义页面完全不需要用到Django ORM的任何功能,可以不用定义虚拟模型,直接编写独立的Admin自定义视图,从根源上避免数据库表校验问题。
内容的提问来源于stack exchange,提问作者user4981459
相关产品推荐
相关产品推荐

