2012-07-03 113 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