【问题标题】:Django ForeignKey Constraint Failed errorDjango ForeignKey 约束失败错误
【发布时间】:2018-12-08 11:11:52
【问题描述】:

我正在使用 django 框架创建一个具有多用户功能的简单博客站点。在我的项目中,如果管理员删除了任何用户,则不应删除该用户的所有博客,我尝试使用

models.ForeignKey(django.contrib.auth.models.User,on_delete=models.CASCADE)

但如果管理员删除用户,它显然会删除所有博客。任何人都可以帮助我吗?提前致谢...

【问题讨论】:

  • 你试过用SET_NULL代替CASCADE

标签: django python-3.x django-models blogs


【解决方案1】:

这是由于 on_delete=CASCADE。这意味着如果ForeignKey 引用的对象被删除,那么它也应该删除引用对象。这样CASCADE 会因此导致大量对象被删除,因为对象的删除实际上会触发其他删除,等等。

有几个选项,列在documentation

  1. CASCADE:删除引用对象;
  2. PROTECT:不允许删除用户,因为存在引用该用户的对象;
  3. SET_NULL:设置为NULL(Python 中为None),在这种情况下,必须在ForeignKey(..) 构造函数中设置null=True
  4. SET_DEFAULT:将ForeignKey 设置回default=... 值;
  5. SET(..):将ForeignKey 设置为传递给SET(..) 构造函数的某个值(也可以使用可调用对象);
  6. DO_NOTHING:这里我们保留一个参考,但一些数据库后端不允许允许这样做,因为这些检查FOREIGN KEY 约束。

所以我们可以例如使用SET_NULL,从而将author设置为NULL/None,以防我们删除作者:

from django.db import models
from django.conf import settings

class Post(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        null=True,
        on_delete=models.SET_NULL
    )
    # ...

最好使用settings.AUTH_USER_MODEL,因为如果您以后更改User 模型,这将自动更改对新模型的引用。

【讨论】:

  • 不,它按预期工作。现在,如果我尝试从管理面板添加博客,我会收到此错误,AttributeError at /admin/blogs/blog/add/ 'NoneType' object has no attribute 'username'
  • @KamleshGupta:你能分享一下你的观点吗?如果author 设置为None,那么很明显,它已经没有username了。
【解决方案2】:

我建议您运行 makemigrations 并再次迁移,因为您可能已删除模型并尝试删除用户。我希望它有所帮助,因为我已经这样解决了我的问题:

python3 manage.py makemigrations
python3 manage.py migrate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多