2010-07-30 128 views
0

我有以下型號:如何刪除django關係中的對象(保留所有相關對象)?

One 
    name (Char) 

Many 
    one (ForeignKey,blank=True,null=True) 
    title (Char) 

我想刪除一個實例和所有相關的對象應該失去其相對於一個實例。目前我的代碼如下所示:

one=One.objects.get(<some criterion>) 

more=Many.objects.filter(one=one) 
for m in more 
    m.one=None 
    m.save() 
#and finally: 
one.delete() 

代碼是幹什麼的? 它找到應該刪除的對象,然後搜索相關對象,將它們的ForeignKey設置爲無,最後刪除實例。但是在這個過程中的某個地方,它也設法殺死所有相關對象(許多實例)。 我的問題是:爲什麼這些相關的對象被刪除,我該如何防止這種情況?

回答

1

給出的代碼是正確的。我在提問時遇到的問題是我的實施中有一個錯字。對我

恥辱

嗯......還有一點,可能在加以改進:

more=Many.objects.filter(one=one) 
for m in more 
    m.one=None 
    m.save() 
#and finally: 
one.delete() 

可以寫爲:

for m in one.many_set.all() 
    m.one=None 
    m.save() 
one.delete() 

這相當於:

one.many_set.clear() 
one.delete() 
1

您可以首先使用一束更新:

Many.objects.filter(one=one).update(one=None) 

我認爲Django的刪除程序上一級相關對象(不包括在DBMS刪除級聯)。所以可能你的對象在某種緩存中,而Django仍然認爲它們與one對象有關。

嘗試在刪除之前列出相關對象。

print one.many_set 
one.delete() 

如果你仍然在這個集合中的任何對象,你可能要再次讀取從DB one,然後刪除。或者你可以使用束刪除:

One.objects.filter(<cryteria>).delete() 
相關問題