如何解决FOREIGN KEY约束失败

时间:2018-01-18 00:45:43

标签: 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的类似示例但是我没有在教程中使用外键,我甚至不知道从他们的示例中导入User对象的位置...是有什么我错过了或教程错过了什么,我只是在版本问题上摔倒?

要重现错误,请严格按照文本教程here进行操作:然后使用您的超级用户帐户登录。编辑用户并单击“保存”并继续编辑。

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

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

来自Django文档

  

在创建数据库表之后更改AUTH_USER_MODEL要困难得多,因为它会影响外键和多对多关系,例如。

     

此更改无法自动完成,需要手动修复架构,从旧用户表移动数据,并可能手动重新应用某些迁移。有关步骤的概述,请参阅#25313。

     

由于Django对可交换模型的动态依赖特性的限制,AUTH_USER_MODEL引用的模型必须在其app的第一次迁移中创建(通常称为0001_initial);否则,你会有依赖性问题。

     

此外,在运行迁移时可能会遇到CircularDependencyError,因为Django由于动态依赖性而无法自动中断依赖循环。如果您看到此错误,则应通过将用户模型所依赖的模型移动到第二次迁移中来中断循环。 (你可以尝试制作两个相互具有ForeignKey的普通模型,看看makemigrations如何解决循环依赖关系,如果你想看看它是如何完成的。)

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

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