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