python - 如何解决 FOREIGN KEY 约束失败

标签 python django django-models django-admin

我正在关注 tutorial在一个基本概念上。如何在 django 中自定义用户。 我不想使用内置的 auth 用户。我发现这个教程似乎一直有效。

我完成了整个教程,一切正常。然而,当我运行我的项目时,登录并在管理区域中打开用户,我单击“保存并继续编辑”这给了我错误

我项目中的代码与教程中的代码完全相同。我尝试删除我的缓存和迁移并重新开始,甚至创建一个新环境并重新安装 django。似乎没有任何效果。

Environment:


Request Method: POST
Request URL: http://localhost:8000/admin/accounts/user/1/change/

Django Version: 2.0.1
Python Version: 3.5.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'accounts']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/backends/base/base.py" in _commit
  239.                 return self.connection.commit()

The above exception (FOREIGN KEY constraint failed) was the direct cause of the following exception:

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
  35.             response = get_response(request)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/contrib/admin/options.py" in wrapper
  574.                 return self.admin_site.admin_view(view)(*args, **kwargs)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapped_view
  142.                     response = view_func(request, *args, **kwargs)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  44.         response = view_func(request, *args, **kwargs)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/contrib/admin/sites.py" in inner
  223.             return view(request, *args, **kwargs)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/contrib/admin/options.py" in change_view
  1556.         return self.changeform_view(request, object_id, form_url, extra_context)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapper
  62.             return bound_func(*args, **kwargs)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapped_view
  142.                     response = view_func(request, *args, **kwargs)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/utils/decorators.py" in bound_func
  58.                 return func.__get__(self, type(self))(*args2, **kwargs2)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/contrib/admin/options.py" in changeform_view
  1450.             return self._changeform_view(request, object_id, form_url, extra_context)

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/transaction.py" in __exit__
  212.                         connection.commit()

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/backends/base/base.py" in commit
  261.         self._commit()

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/backends/base/base.py" in _commit
  239.                 return self.connection.commit()

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/utils.py" in __exit__
  89.                 raise dj_exc_value.with_traceback(traceback) from exc_value

File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/backends/base/base.py" in _commit
  239.                 return self.connection.commit()

Exception Type: IntegrityError at /admin/accounts/user/1/change/
Exception Value: FOREIGN KEY constraint failed

我不确定这是怎么回事,这与我的 django 版本有关吗?我正在使用 2.0。

我在 stackoverflow 上看过类似的例子,比如 this但是我没有在教程中使用外键,我什至不知道在他们的示例中从哪里导入了用户对象......是否有我遗漏的东西或教程遗漏的东西而我只是坠落版本问题?

要重现错误,请完全按照文本教程 here : 然后使用您的 super 用户帐户登录。编辑用户并点击保存并继续编辑。

感谢任何帮助

最佳答案

我想我已经找到了解决办法。当您将默认的 AUTH_USER_MODEL 迁移到项目中间的自定义模型时,问题很可能是由循环依赖性问题引起的。

来自 Django 文档

Changing AUTH_USER_MODEL after you’ve created database tables is significantly more difficult since it affects foreign keys and many-to-many relationships, for example.

This change can’t be done automatically and requires manually fixing your schema, moving your data from the old user table, and possibly manually reapplying some migrations. See #25313 for an outline of the steps.

Due to limitations of Django’s dynamic dependency feature for swappable models, the model referenced by AUTH_USER_MODEL must be created in the first migration of its app (usually called 0001_initial); otherwise, you’ll have dependency issues.

In addition, you may run into a CircularDependencyError when running your migrations as Django won’t be able to automatically break the dependency loop due to the dynamic dependency. If you see this error, you should break the loop by moving the models depended on by your user model into a second migration. (You can try making two normal models that have a ForeignKey to each other and seeing how makemigrations resolves that circular dependency if you want to see how it’s usually done.)

解决此问题的最佳方法是删除表并删除所有迁移文件,然后使用新制作的自定义模型重新运行迁移。希望这会奏效。

有关如何从内置模型迁移到新模型的更多详细信息,请参见此处 https://code.djangoproject.com/ticket/25313

关于python - 如何解决 FOREIGN KEY 约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48312224/

相关文章:

python - TextMate 和 Django 集成 - 支持 {% %} 标记

django - 创建表单并使用 django 中的相同 View 进行更新

django - 从 Django 迁移中排除应用程序

python - create_user() 缺少 1 个必需的位置参数 : 'username'

django - 运行 "python manage.py migrate"命令时 Django 中出现 ValueError

python - 如何找出K-最近邻算法中属性的权重?

python - 将 FastAPI 中的请求记录到项目目录中的特定文件中

python - 我可以将函数作为参数发送到具有多处理功能的所有进程吗?

Python - 将列表中的项目设置为字典值列表

python - 我如何正确更改 Django Web 应用程序中分配的 key