如何解决外键约束失败

2024-04-24 04:34:44 发布

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

我遵循一个基本概念。如何在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,但是我在教程中没有使用外键,我甚至不知道在他们的例子中从哪里导入用户对象。。。是不是有些东西我遗漏了,或者是教程遗漏了,而我只是因为一个版本问题跌倒了?在

要重现错误,请严格遵循文本教程here:然后使用超级用户帐户登录。编辑用户,然后单击“保存”并继续编辑。在

感谢任何帮助


Tags: djangoinpyviewhomebaselibpackages
1条回答
网友
1楼 · 发布于 2024-04-24 04:34:44

我想我已经找到了解决办法。这个问题很可能是由于将默认的AUTH_USER_模型迁移到项目中间的自定义模型时的循环依赖关系问题引起的。在

从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

相关问题 更多 >