【问题标题】:How do I delete an object in a django relation (While keeping all related objects)?如何删除 django 关系中的对象(同时保留所有相关对象)?
【发布时间】:2011-03-23 11:13:35
【问题描述】:

我有以下型号:

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

【问题讨论】:

    标签: python django django-database


    【解决方案1】:

    您可以首先使用update()

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

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

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

    print one.many_set
    one.delete()
    

    如果您在此集合中仍有任何对象,您可能应该再次从 DB 中获取 one,然后删除。或者你可以使用delete():

    One.objects.filter(<criteria>).delete()
    

    【讨论】:

      【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 2020-05-03
        • 2013-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-27
        • 2017-04-12
        • 2011-09-14
        • 1970-01-01
        相关资源
        最近更新 更多