Django迁移循环依赖

2024-09-29 23:29:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我想将一个应用程序重命名为其他名称,所以我这样做并更新了中的所有相关文件,包括app.py配置文件

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

从那以后,我一直无法完成应用程序的makemigration

我甚至重新创建了我重新命名的应用程序,方法是执行django admin startapp“appname”,然后复制models.py admin.py等的内容,看看我是否造成了内部问题,但我就是搞不清楚到底发生了什么

我从另一个apps admin.py文件中删除了这个文件(如下),成功地完成了所有应用程序的makemigrations,包括我重新制作的应用程序

# accounts/admin.py

class SigBotSettingsInLine(admin.StackedInline):
    model = SigBotSettings

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

但最终python manage.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

帐户/迁移/0001_initial.py中的依赖项

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

帐户/迁移/0002_auto_20210809_1910.py中的依赖项

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

信号/迁移/0001_initial.py中的依赖关系

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

Tags: djangoinpy应用程序adminlibpackagesline
2条回答

已解决:

是的,非常感谢您指出迁移依赖性问题,阅读该链接使我清楚地了解了makemigrations函数的工作原理

因此,在我查看了依赖项之后,我发现在Signals.models文件中有一个foriegnkey,它在迁移之前链接到Signals应用程序

我注释掉了这条外键线,然后迁移了,一切都很好

我甚至在之后添加了foreignkey并更新了迁移,这也起到了作用,因为此时信号数据库已经迁移了

我知道这是一个坏习惯,但他会改变的方式,外键是通过另一种方法连接

谢谢你的帮助

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再次生成它们。这应该可以解决问题,除非模型依赖项本身存在潜在问题

警告

编辑或删除迁移时要非常小心。如果您的项目已部署到live server,那么编辑已应用的迁移充其量将一事无成,充其量将完全破坏您的生产数据库。仅当您正在处理尚未部署的项目时,才应使用继续建议

相关问题 更多 >

    热门问题