2010-07-30 81 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() 
相关问题