Django执行makemigrations报错:post_syncdb信号不存在的解决咨询
问题
在他人的Django项目dev分支工作,无法修改当前Django版本。新增两个模型后执行python3 manage.py makemigrations时出现错误:AttributeError: module 'django.db.models.signals' has no attribute 'post_syncdb'。该信号在新版本Django中已废弃,现寻求无需修改Django版本的解决方法、正常执行迁移的步骤以及可更新的相关包。
新增的模型代码
class Categories(models.Model): name = models.CharField(max_length=100) position = models.IntegerField(unique=True) def __str__(self): return self.name @classmethod def get_default_pk(cls): obj, created = cls.objects.get_or_create( name='No category was added', position=99 ) return obj.pk class Shop(models.Model): name = models.CharField(_('shop name'), max_length=128) domain = models.CharField(_('domain'), max_length=128) active = models.BooleanField(_('active'), default=True) position = models.PositiveSmallIntegerField(_('position'), default=0) category = models.ForeignKey(Categories, on_delete=models.CASCADE, related_name='related_name_category', default=Categories.get_default_pk()) class Meta: ordering = ('position', 'name') verbose_name = _('shop') verbose_name_plural = _('shops') def __str__(self): return self.name
完整报错回溯
Traceback (most recent call last): File "/Users/ArtemBoss/GitHubRepos/pricemon/manage.py", line 22, in <module> main() File "/Users/ArtemBoss/GitHubRepos/pricemon/manage.py", line 18, in main execute_from_command_line(sys.argv) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line utility.execute() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/core/management/__init__.py", line 420, in execute django.setup() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/apps/registry.py", line 116, in populate app_config.import_models() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/django/apps/config.py", line 304, in import_models self.models_module = import_module(models_module_name) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/constance/models.py", line 30, in <module> signals.post_syncdb.connect(create_perm, dispatch_uid="constance.create_perm") AttributeError: module 'django.db.models.signals' has no attribute 'post_syncdb'
解决方法
1. 定位问题根源
从回溯信息可知,错误来自constance包的models.py文件,它调用了已废弃的post_syncdb信号。该信号在Django 1.9之后被移除,替换为post_migrate信号。
2. 无需修改Django版本的解决方案
方案一:更新constance包到兼容版本
- 查看当前
constance版本:pip show django-constance - 安装适配当前Django版本的
constance版本:- 若当前Django为2.x及以上,安装
constance2.0.0及以上版本(该版本已将post_syncdb替换为post_migrate) - 执行更新命令:
pip install --upgrade django-constance
- 若当前Django为2.x及以上,安装
方案二:临时猴子补丁(应急用,不推荐)
若无法更新constance,可在项目settings.py最顶部添加以下代码绕过错误:
from django.db.models import signals if not hasattr(signals, 'post_syncdb'): signals.post_syncdb = signals.post_migrate
注意:此方法仅临时修复,可能引发其他潜在问题,优先选择更新包。
3. 正常执行迁移步骤
- 解决依赖问题后,生成迁移文件:
python3 manage.py makemigrations - 应用迁移:
python3 manage.py migrate
4. 可更新的相关包
除django-constance外,还需检查其他依赖包是否存在废弃API调用,常见需更新的包包括:
django-crispy-forms:确保版本适配当前Djangodjango-rest-framework:根据Django版本选择对应兼容版本django-filter:匹配当前Django版本
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

