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
相关产品推荐
相关产品推荐

