2

我有以下模型:

One
   name (Char)

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

我想删除一个One实例,所有相关对象都应该失去与One实例的关系。目前我的代码如下所示:

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 设置为 None,最后删除One实例。但是在该进程的某个地方,它还设法杀死进程中的所有相关对象(许多实例)。我的问题是:为什么这些相关对象会被删除,我该如何防止呢?

4

2 回答 2

2

给出的代码是正确的。问这个问题时我的问题是我的实施中的一个错字。

对我感到羞耻

嗯......还有一些可以改进的地方:

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()
于 2010-08-01T09:37:44.320 回答
1

您可以update()首先使用:

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

我认为 Django 在程序级别删除相关对象(在 DBMS 中没有删除级联)。所以可能你的对象在某种缓存中,Django 仍然认为它们与one对象有关。

尝试在删除之前列出相关对象。

print one.many_set
one.delete()

如果你在这个集合中还有任何对象,你可能应该one再次从数据库中获取,然后删除。或者您可以使用delete()

One.objects.filter(<criteria>).delete()
于 2010-08-01T08:20:37.563 回答