【问题标题】:Can't get rid of "nonexistent parent node" in django 1.11无法摆脱 django 1.11 中的“不存在的父节点”
【发布时间】:2017-12-20 19:24:24
【问题描述】:

到目前为止,我已经尝试了互联网在这个问题上给我的任何方法,但我仍然没有解决它。

Python 3.6.1 - django 1.11.2 - virtualenv
我有一个 django 项目,有两个应用程序 accountapp2。最近,随着项目的发展,我决定将它们分成更合适的应用程序。现在我总共有 8 个应用程序,其中account 被拆分为user_authuser,然后我删除了account。为了进一步整理,我将所有应用程序从根文件夹移至/apps/

到目前为止,只有user, user_auth, app2 被使用,而app2 未被触及。
每个单独文件中的代码都被拆分,移动到指定的应用程序并重新编码以从正确的路径获取导入。

为了重新开始,我删除了 db.sqlite3 文件,删除了所有 *.pyc 文件,删除了所有 __pycache__ 文件夹并清空了 migrations 文件夹,确保保留所有 __init__.py 文件。

通过 virtualenv 运行 python manage.py migrate 会给我这个输出:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
  File "H:\Programming\VirProjDir\lib\site-packages\django\core\management\__init__.py", line 363, in execute_from_command_line
utility.execute()
  File "H:\Programming\VirProjDir\lib\site-packages\django\core\management\__init__.py", line 355, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
  File "H:\Programming\VirProjDir\lib\site-packages\django\core\management\base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
  File "H:\Programming\VirProjDir\lib\site-packages\django\core\management\base.py", line 330, in execute
output = self.handle(*args, **options)
  File "H:\Programming\VirProjDir\lib\site-packages\django\core\management\commands\migrate.py", line 83, in handle
executor = MigrationExecutor(connection, self.migration_progress_callback)
  File "H:\Programming\VirProjDir\lib\site-packages\django\db\migrations\executor.py", line 20, in __init__
self.loader = MigrationLoader(self.connection)
  File "H:\Programming\VirProjDir\lib\site-packages\django\db\migrations\loader.py", line 52, in __init__
self.build_graph()
  File "H:\Programming\VirProjDir\lib\site-packages\django\db\migrations\loader.py", line 274, in build_graph
raise exc
  File "H:\Programming\VirProjDir\lib\site-packages\django\db\migrations\loader.py", line 244, in build_graph
self.graph.validate_consistency()
  File "H:\Programming\VirProjDir\lib\site-packages\django\db\migrations\graph.py", line 261, in validate_consistency
[n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)]
  File "H:\Programming\VirProjDir\lib\site-packages\django\db\migrations\graph.py", line 261, in <listcomp>
[n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)]
  File "H:\Programming\VirProjDir\lib\site-packages\django\db\migrations\graph.py", line 104, in raise_error
raise NodeNotFoundError(self.error_message, self.key, origin=self.origin)
django.db.migrations.exceptions.NodeNotFoundError: Migration auth.0009_user_following dependencies reference nonexistent parent node ('account', '0002_contact')

到目前为止,我没有使用这些命令,确保删除所有缓存和 *.pyc 文件:

python manage.py migrate
python manage.py makemigrations
python manage.py makemigrations <app_name>
python manage.py flush
python manage.py --fake
python manage.py --fake <app_name> zero
etc..

我不明白为什么 ('account', '0002_contact') 一直出现,即使我已经删除了与我的代码没有直接关系的任何内容。
“包含文本”的搜索显示没有 account 如此。

知道下一步该往哪里看吗?

【问题讨论】:

标签: django python-3.x django-models virtualenv django-migrations


【解决方案1】:

显然 django 将迁移文件保存在它自己的模块文件夹中。这就是我所做的:

  1. pip uninstall django
  2. /Lib/site-packages,已删除 django 文件夹。
  3. 删除了我项目中的所有*.pyc 文件。
  4. 删除了我项目中的所有 __pycache__ 文件夹。
  5. 清除了我项目中的所有migrations 文件夹(保留__init__.py)。
  6. pip install django==x.x.x
  7. python manage.py migrate
  8. python manage.py makemigrations &lt;app_name&gt;
  9. python manage.py migrate
  10. python manage.py runserver
  11. 庆祝一下。

【讨论】:

  • 这里有两个命令在 Linux 中删除 .pyc 文件和 __pycache__ 文件夹:find . -name '*.pyc' -type f -delet & find ~ -path '*/__pycache__*' -delete
【解决方案2】:

这不是原始海报的问题。但是,当我遇到类似的错误时,这就是我修复它的方法。

就我而言,我在依赖模块名称中有.py 扩展名,如下所示:

dependencies = [
    ('dashboard', '0003_auto_20181024_0603.py'),
    ('auth', '__latest__'),
    ('contenttypes', '__latest__'),
]

我删除了.py,把它改成了这个

    ('dashboard', '0003_auto_20181024_0603')

【讨论】:

    【解决方案3】:

    我最近遇到了与您类似的问题,希望这可以为您找到解决方案提供一些方向。

    我的问题只发生在我的生产环境中。

    为什么?我会解释的。

    我们使用 git 进行版本控制,当我在本地进行开发工作时,我不知何故将 app/migrations/0009.py 文件包含到了 .gitignore 文件中。

    长话短说,我将更改推送到远程服务器并继续应用迁移,但会不断遇到您描述的问题。

    在摆弄了 manage.py 和所有无意中没有产生任何解决方案的迁移命令之后,我记得我没有查看是否存在丢失的依赖文件。

    解决方案:
    我通过在我的 Django 项目文件夹中的 shell 中运行此命令来检查依赖文件是否存在于 prod 环境中。

    $ ls app/migration
    

    这表明所需的依赖文件不存在。

    那时我决定检查我的本地 .gitignore 文件并删除了 app/migrations/0009.py

    我提交了本地更改并推送到产品服务器。然后,我通过运行此命令确认所需的文件存在于 prod 服务器上。

    $ ls app/migration
    

    我跑了

    $ ./manage.py check
    

    - 这一次问题解决了。

    总而言之,检查以确保所需的依赖文件确实存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 2015-04-24
      • 2011-01-23
      相关资源
      最近更新 更多