我正在使用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 admin
。redditdb
,约束redditapp_comment
外国 键({redditapp_comment_owner_id_fdc65fee_fk_redditapp_profile_id
)参考owner_id
(redditapp_profile
))')
我使用了用户id
,所以我不知道为什么会收到此错误。我需要在模型中重组外键吗?
实际上,reddit遵循以下结构:删除父注释时,其子注释不会被删除。删除的父注释将被短划线或删除,并且其子注释仍会显示。知道这一点后,我该如何继续处理我的代码,应该完全删除个人资料吗?
答案 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
模型的Profile
和Comment
模型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 )