Django 外键约束失败错误

Kam*_*pta 6 django blogs django-models python-3.x

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

models.ForeignKey(django.contrib.auth.models.User,on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)

但如果管理员删除用户,它显然会删除所有博客。有人可以帮我吗?预先感谢...

Wil*_*sem 12

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

文档中列出了几个选项:

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

因此,我们可以使用SET_NULL,然后将其设置authorNULL/ 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
    )
    # ...
Run Code Online (Sandbox Code Playgroud)

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