You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类的相关方法,避免触发数据库查询
    默认的ModelAdmin changelist页面会尝试查询模型的数据库数据,即便添加了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 10:54:00