【问题标题】:How to resolve FOREIGN KEY constraint failed如何解决 FOREIGN KEY 约束失败
【发布时间】:2018-01-18 00:45:43
【问题描述】:

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

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

我的项目中的代码与教程中的完全相同。我已经尝试删除我的缓存和迁移并重新开始,甚至创建一个新环境并重新安装 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:然后使用您的超级用户帐户登录。编辑用户并点击保存并继续编辑。

感谢任何帮助

【问题讨论】:

  • 你在settings.py中使用过AUTH_USER_MODEL吗?
  • 是的,它设置为accounts.User,它与教程@jheld中的相同
  • 因为您不会使用自定义用户模型,所以不应设置该变量(例如删除该行)。这可能足以解决问题——如果我没有更改默认的 django 用户模型,我从未设置过该变量。
  • @jhld 这不是我想要的,但是如果您阅读教程,我确实想要自定义用户模型...我正在尝试使用电子邮件字段而不是用户名...删除此选项from settings 使其恢复为用户名...
  • 如果您这样做是因为您实际上想在实际项目中使用电子邮件而不是用户名,您可能只想使用django-username-email

标签: python django django-models django-admin


【解决方案1】:

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

来自 Django 文档

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

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

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

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

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

可以在此处找到有关如何从内置模型迁移到新模型的更多详细信息 https://code.djangoproject.com/ticket/25313

【讨论】:

    【解决方案2】:

    来自@Jishnu 的回答,这里是您需要执行的所有命令

    1。删除所有迁移文件

    转到 App>迁移并删除所有迁移文件,这很重要,否则下次运行迁移时,挂起的迁移文件也将被应用。

    离开 initpychache

    2。清理数据库这将清理所有数据库数据,包括超级用户

    python manage.py flush
    

    3。运行迁移

    python manage.py makemigrations
    python manage.py migrate
    

    4。现在创建一个超级用户

    python manage.py createsuperuser
    

    应该是这样的。

    如果您不想丢失数据,可以使用 pgadmin 之类的工具并将数据保存在其他位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      相关资源
      最近更新 更多