django-删除用户会引发完整性错误

时间:2018-06-28 15:15:28

标签: django django-models foreign-keys

我正在使用Django执行“ Reddit Clone”操作,这些是我的模型:

models.py

class Profile(models.Model):
    owner = models.OneToOneField(User, on_delete=models.CASCADE)
    dob = models.DateField()
    karma = models.IntegerField(default=0)

class Subreddit(models.Model):
    owner = models.ForeignKey(Profile, on_delete=models.DO_NOTHING, null=True, blank=True, related_name='subreddits')
    name = models.CharField(max_length=100)
    title = models.CharField(max_length=100)
    description = models.CharField(max_length=500)
    subscribers = models.ManyToManyField(Profile, blank=True, related_name='subscriptions')
    moderators = models.ManyToManyField(Profile, blank=True, related_name='moderates')

class Post(models.Model):
    owner = models.ForeignKey(Profile, on_delete=models.DO_NOTHING)
    title = models.CharField(max_length=300)
    content = models.CharField(max_length=1000)
    votes = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    subreddit = models.ForeignKey(Subreddit, on_delete=models.CASCADE)

class Comment(models.Model):
    owner = models.ForeignKey(Profile, on_delete=models.DO_NOTHING)
    content = models.CharField(max_length=500)
    votes = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    parent_post = models.ForeignKey(Post, on_delete=models.CASCADE)
    parent_comment = models.ForeignKey("Comment", null=True, blank=True, on_delete=models.CASCADE)

现在,我尝试删除一个刚完成1次user的{​​{1}}。当我尝试从comment删除user时,出现以下错误。

  

/ admin / auth / user / 2 / delete /处的IntegrityError(1451,'无法删除或   更新父行:外键约束失败   ({django adminredditdb,约束   redditapp_comment外国   键({redditapp_comment_owner_id_fdc65fee_fk_redditapp_profile_id)参考owner_idredditapp_profile))')

我使用了用户id,所以我不知道为什么会收到此错误。我需要在模型中重组外键吗?


实际上,reddit遵循以下结构:删除父注释时,其子注释不会被删除。删除的父注释将被短划线或删除,并且其子注释仍会显示。知道这一点后,我该如何继续处理我的代码,应该完全删除个人资料吗?

3 个答案:

答案 0 :(得分:1)

您的评论与用户没有直接关系。它通过配置文件关联。因此,当您删除用户时,其配置文件也会被删除。当评论变得悬而未决时,这会影响评论。

您可以拥有

owner = models.ForeignKey(Profile, on_delete=models.CASCADE)

owner = models.ForeignKey(Profile, on_delete=models.DO_NOTHING ,null=True)

答案 1 :(得分:0)

错误提到应用程序owner_id redditapp模型的Comment引用 应用程序id redditapp模型的ProfileComment模型owner ForeignKey on_delete属性 设置为models.DO_NOTHIN

  

不做任何事情

     

不采取任何措施。如果您的数据库后端强制执行   参照完整性,这将导致 IntegrityError   手动将SQL ON DELETE约束添加到数据库字段。

您的最佳选择是on_delete=models.CASCADE,因为注释与特定的Profile相关联,如果删除了Profile,则其Comment会变成匿名,而没有标识{{1} }。

编辑:

如果删除父注释,则子对象不会删除,并且对父注释的引用将设置为

Profile

class Comment(models.Model): owner = models.ForeignKey(Profile, on_delete=models.CASCADE) content = models.CharField(max_length=500) votes = models.IntegerField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) parent_post = models.ForeignKey(Post, on_delete=models.CASCADE) parent_comment = models.ForeignKey("Comment", null=True, blank=True, on_delete=models.SET_NULL) 模型也是如此:

Post

或者您也可以使用models.PROTECT

防止删除个人资料

答案 2 :(得分:0)

您有两个选择:

parent_post = models.ForeignKey(Post, on_delete=models.CASCADE)

parent_post = models.ForeignKey(Post, on_delete=models.DO_NOTHING )
相关问题