Django 迁移循环依赖

Django Migrations Circular Dependencies

所以我的 django 项目运行得非常好,一切正常。

我想重命名一个应用程序,所以我做了并更新了所有相关文件,包括 app.py 配置文件。

我还清除了数据库并从每个应用程序中删除了所有迁移文件。

从那时起,我就再也无法完成对我的应用程序的迁移。

我什至重新创建了我重命名的应用程序,方法是执行 django-admin startapp "appname" 然后复制 models.py admin.py 等的内容,看看我是否以某种方式导致内部问题但我就是想不通这是怎么回事?

我确实设法让所有应用程序的所有 makemigrations 都成功,包括我从另一个应用程序 admin.py 文件

中删除这个(下面)时重新制作的应用程序
# accounts/admin.py

class SigBotSettingsInLine(admin.StackedInline):
    model = SigBotSettings

@admin.register(Bot)
class BotAdmin(admin.ModelAdmin,):
    ...
    inlines = [SigBotSettingsInLine]

但是最后pythonmanage.py迁移,还是失败了。如果有人愿意提供帮助,我们将不胜感激。

这是错误代码:

(dguacENV) PS C:\Users\Admin\Desktop\djangoProjects\dguac> python manage.py makemigrations accounts
Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\Admin\anaconda3\envs\dguacENV\lib\site-packages\django\core\management\__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "C:\Users\Admin\anaconda3\envs\dguacENV\lib\site-packages\django\core\management\__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\Admin\anaconda3\envs\dguacENV\lib\site-packages\django\core\management\base.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\Admin\anaconda3\envs\dguacENV\lib\site-packages\django\core\management\base.py", line 398, in execute
    output = self.handle(*args, **options)
  File "C:\Users\Admin\anaconda3\envs\dguacENV\lib\site-packages\django\core\management\base.py", line 89, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\Users\Admin\anaconda3\envs\dguacENV\lib\site-packages\django\core\management\commands\makemigrations.py", line 88, in handle
    loader = MigrationLoader(None, ignore_no_migrations=True)
  File "C:\Users\Admin\anaconda3\envs\dguacENV\lib\site-packages\django\db\migrations\loader.py", line 53, in __init__
    self.build_graph()
  File "C:\Users\Admin\anaconda3\envs\dguacENV\lib\site-packages\django\db\migrations\loader.py", line 286, in build_graph
    self.graph.ensure_not_cyclic()
  File "C:\Users\Admin\anaconda3\envs\dguacENV\lib\site-packages\django\db\migrations\graph.py", line 274, in ensure_not_cyclic
    raise CircularDependencyError(", ".join("%s.%s" % n for n in cycle))
django.db.migrations.exceptions.CircularDependencyError: accounts.0001_initial, accounts.0002_auto_20210809_1814, signals.0001_initial

accounts/migrations/0001_initial.py

中的依赖项
dependencies = [
    ('signals', '__first__'),
    ('auth', '0012_alter_user_first_name_max_length'),
]

accounts/migraitons/0002_auto_20210809_1910.py

中的依赖项
dependencies = [
    ('accounts', '0001_initial'),
]

signals/migrations/0001_initial.py

中的依赖项
dependencies = [
    ('accounts', '0002_auto_20210809_1910'),
]

Dependencies in accounts/migrations/0001_initial.py

dependencies = [
    ('signals', '__first__'),
    ('auth', '0012_alter_user_first_name_max_length'),
]

Dependencies in accounts/migraitons/0002_auto_20210809_1910.py

dependencies = [
    ('accounts', '0001_initial'),
]

Dependencies in signals/migrations/0001_initial.py

dependencies = [
    ('accounts', '0002_auto_20210809_1910'),
]

这告诉我们以下内容:

  1. accounts.0001.initial 取决于 signals.0001_initial(由 '__first__' 指定。
  2. accounts.0002_auto_20210809_1910 取决于 accounts.0001.initial
  3. signals.0001_initial.py 取决于 accounts.0002_auto_20210809_1910

圆度要清楚

您可以手动编辑这些依赖项或删除所有迁移并使用 ./manage.py makemigrations 重新生成它们,这应该可以解决问题,除非模型依赖项本身存在潜在问题。

警告

编辑或删除迁移时要非常小心。如果您的项目部署到实时服务器,编辑已经应用的迁移充其量只会无能为力,最坏的情况是会完全破坏您的生产数据库。仅当您正在处理尚未部署的项目时才应使用继续建议。

已解决:

非常感谢您指出迁移依赖问题,阅读 link 让我清楚地了解了 makemigrations 函数的工作原理。

所以在查看我的依赖项之后,我发现在我的 Signals.models 文件中有一个 foriegnkey 在它被迁移之前 linked 到 Signals 应用程序。

我注释掉了这条外键行,然后迁移,一切正常。

之后我什至添加了外键并更新了迁移,这也有效,因为此时信号数据库已经迁移。

我知道这是不好的做法,他会通过另一种方法改变外键的 linked 方式吗?

感谢帮助。