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

Django新建数据库迁移报错:jobs_role表不存在的解决问询

解决Django迁移时Admin类直接查询模型导致的表不存在错误

问题根源很明确:Django启动时会立刻加载admin模块,你原来在TagCategoryDefaultImportanceAdmin的extra和max_num属性里直接调用len(Role.objects.all()),这会触发即时数据库查询。但新建数据库跑迁移时,jobs_role表还没创建,自然就报找不到表的错误——生产环境表已经存在,所以没问题。

两种正确处理方式

方式一:重写动态获取方法

Django的ModelAdmin支持通过get_extra()和get_max_num()方法动态返回数值,替代直接在类属性里硬编码查询:

from django.contrib import admin
from django.db.utils import OperationalError
from .models import TagCategoryDefaultImportance, Role

class TagCategoryDefaultImportanceAdmin(admin.ModelAdmin):
    # 删掉原来的extra和max_num类属性
    def get_extra(self, request, obj=None, **kwargs):
        try:
            return len(Role.objects.all())
        except OperationalError:
            # 迁移阶段表不存在时返回默认值,比如0
            return 0

    def get_max_num(self, request, obj=None, **kwargs):
        try:
            return len(Role.objects.all())
        except OperationalError:
            return 0

admin.site.register(TagCategoryDefaultImportance, TagCategoryDefaultImportanceAdmin)

方式二:先检查表是否存在

在方法里先判断jobs_role表是否已创建,再执行查询:

from django.contrib import admin
from django.db import connection
from .models import TagCategoryDefaultImportance, Role

class TagCategoryDefaultImportanceAdmin(admin.ModelAdmin):
    def get_extra(self, request, obj=None, **kwargs):
        if 'jobs_role' in connection.introspection.table_names():
            return len(Role.objects.all())
        return 0

    def get_max_num(self, request, obj=None, **kwargs):
        if 'jobs_role' in connection.introspection.table_names():
            return len(Role.objects.all())
        return 0

admin.site.register(TagCategoryDefaultImportance, TagCategoryDefaultImportanceAdmin)

内容的提问来源于stack exchange,提问作者SmallJoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:45:11