如何删除django关系中的对象(同时保留所有相关对象)?

时间:2010-07-30 21:10:17

标签: python django django-database

我有以下型号:

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 实例。但在该过程中的某个地方,它还设法在进程中终止所有相关对象(许多实例)。 我的问题是:为什么这些相关对象被删除,我该如何防止这种情况?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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()