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

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及以上,安装constance 2.0.0及以上版本(该版本已将post_syncdb替换为post_migrate)
    • 执行更新命令:pip install --upgrade django-constance

方案二:临时猴子补丁(应急用,不推荐)

若无法更新constance,可在项目settings.py最顶部添加以下代码绕过错误:

from django.db.models import signals
if not hasattr(signals, 'post_syncdb'):
    signals.post_syncdb = signals.post_migrate

注意:此方法仅临时修复,可能引发其他潜在问题,优先选择更新包。

3. 正常执行迁移步骤

  1. 解决依赖问题后,生成迁移文件:python3 manage.py makemigrations
  2. 应用迁移:python3 manage.py migrate

4. 可更新的相关包

除django-constance外,还需检查其他依赖包是否存在废弃API调用,常见需更新的包包括:

  • django-crispy-forms:确保版本适配当前Django
  • django-rest-framework:根据Django版本选择对应兼容版本
  • django-filter:匹配当前Django版本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:27:46