2012-07-03 80 views
2

我使用的是django-threadedcomments应用程序,并且由于在下面给出的模型中,parent是一个线程注释的外键,当我删除注释时它也会被删除。但我不希望这种情况发生。所以我加on_delete = models.SET_NULL,但这似乎没有工作。删除评论时,父注释仍会被删除。django on_delete not working

这里是螺纹评论模型的一部分,其余的都只是方法,所以我跳过他们

class ThreadedComment(Comment): 
    title = models.TextField(_('Title'), blank=True) 
    parent = models.ForeignKey('self', null=True, blank=True, default=None, 
     related_name='children', verbose_name=_('Parent'), on_delete=models.SET_NULL) 
    last_child = models.ForeignKey('self', null=True, blank=True, 
     verbose_name=_('Last child')) 
    tree_path = models.TextField(_('Tree path'), editable=False, 
     db_index=True) 

    objects = CommentManager() 

有什么,我做错了什么?

+0

你在使用什么数据库引擎?你有没有在数据库中设置“ON DELETE CASCADE”? –

+0

您使用的是什么版本的Django?级联行为仅在1.3中更改(https://docs.djangoproject.com/en/dev/releases/1.3/#configurable-delete-cascade) –

+0

我正在使用Django 1.3和MySQL。删除级联在db – Sachin

回答

1

螺纹注释是DELETE CASCADE的教科书示例。你有一个层次结构,所以如果一个评论的父母被删除,所有的孩子也需要被删除。否则,他们是孤儿,你的层次结构被打破。特别是对于评论,您不能仅仅为新的父母分配一个孩子评论,因为他们通常是上下文的,并且在回复发布的评论的上下文之外没有意义。

如果你看看整个互联网网站的评论部分。当评论是线程评论者被允许删除他们的评论(其实大多数网站不要让你删除你的意见),他们从来没有实际上删除评论。相反,内容只是简单地改为“此评论已被删除”。这样,内容在技术上已经消失,满足用户或主持人,它仍然挂起为了层次结构。

+0

中设置我明白你在说什么,一旦删除了评论,它的所有孩子也必须被删除。但是我想要做的是如果评论被删除,那么不要删除评论的父删除。这就是为什么我想为父外键设置'on_delete = models.SET_NULL'。删除注释的父项并不合理,但删除注释 – Sachin

+1

Django不这么做。 DELETE CASCADE删除具有外键*的任何内容到*被删除的内容,而不是该对象本身的外键。如果父项被删除,你的代码中就会出现一些错误 - 这不是DELETE CASCADE。 –

+0

我不知道为什么我看到这种行为,因为我正在删除一个孩子的评论,父母也被删除。我正在使用threadedcomments应用程序,但似乎没有任何错误 – Sachin