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'),
]
这告诉我们以下内容:
accounts.0001.initial
取决于 signals.0001_initial
(由 '__first__'
指定。
accounts.0002_auto_20210809_1910
取决于 accounts.0001.initial
signals.0001_initial.py
取决于 accounts.0002_auto_20210809_1910
圆度要清楚
您可以手动编辑这些依赖项或删除所有迁移并使用 ./manage.py makemigrations
重新生成它们,这应该可以解决问题,除非模型依赖项本身存在潜在问题。
警告
编辑或删除迁移时要非常小心。如果您的项目部署到实时服务器,编辑已经应用的迁移充其量只会无能为力,最坏的情况是会完全破坏您的生产数据库。仅当您正在处理尚未部署的项目时才应使用继续建议。
已解决:
非常感谢您指出迁移依赖问题,阅读 link 让我清楚地了解了 makemigrations 函数的工作原理。
所以在查看我的依赖项之后,我发现在我的 Signals.models 文件中有一个 foriegnkey 在它被迁移之前 linked 到 Signals 应用程序。
我注释掉了这条外键行,然后迁移,一切正常。
之后我什至添加了外键并更新了迁移,这也有效,因为此时信号数据库已经迁移。
我知道这是不好的做法,他会通过另一种方法改变外键的 linked 方式吗?
感谢帮助。
所以我的 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'), ]
这告诉我们以下内容:
accounts.0001.initial
取决于signals.0001_initial
(由'__first__'
指定。accounts.0002_auto_20210809_1910
取决于accounts.0001.initial
signals.0001_initial.py
取决于accounts.0002_auto_20210809_1910
圆度要清楚
您可以手动编辑这些依赖项或删除所有迁移并使用 ./manage.py makemigrations
重新生成它们,这应该可以解决问题,除非模型依赖项本身存在潜在问题。
警告
编辑或删除迁移时要非常小心。如果您的项目部署到实时服务器,编辑已经应用的迁移充其量只会无能为力,最坏的情况是会完全破坏您的生产数据库。仅当您正在处理尚未部署的项目时才应使用继续建议。
已解决:
非常感谢您指出迁移依赖问题,阅读 link 让我清楚地了解了 makemigrations 函数的工作原理。
所以在查看我的依赖项之后,我发现在我的 Signals.models 文件中有一个 foriegnkey 在它被迁移之前 linked 到 Signals 应用程序。
我注释掉了这条外键行,然后迁移,一切正常。
之后我什至添加了外键并更新了迁移,这也有效,因为此时信号数据库已经迁移。
我知道这是不好的做法,他会通过另一种方法改变外键的 linked 方式吗?
感谢帮助。