为什么在Django中不能执行模型的自定义delete()函数?

时间:2017-02-14 08:38:36

标签: python django django-models

如何理解Django官方文档中的以下陈述?

  

请记住,只要有可能,这将完全在SQL中执行,因此在此过程中不一定会调用单个对象实例的delete()方法。如果您在模型类上提供了自定义delete()方法并希望确保调用它,则需要“手动”删除该模型的实例(例如,通过迭代QuerySet并调用{{ 1}}分别在每个对象上)而不是使用QuerySet的批量delete()方法。

在大多数情况下,我们仍需要在自定义的delete()函数中调用超类中的原始delete()函数。为什么由于底层SQL而无法执行delete()函数的自定义版本?提到批量操作意味着什么?

2 个答案:

答案 0 :(得分:0)

如果你打电话给Foo.objects.all().delete()(一个QuerySet),它就不会工作。

如果你打电话

会工作
for foo in Foo.objects.all():
    foo.delete()

(个别对象)

答案 1 :(得分:0)

对于名为MyModel的模型,有两种不同的delete方法:

  • MyModel中的一个,用于每个对象

    m = MyModel.objects.first()
    m.delete() # here you use the methode defined in MyModel
    
  • 一个QuerySet,它使用单个SQL一次删除所有对象:

    qs = MyModel.objects.filter(...)
    qs.delete() # this is the queryset bulk delete
    

    此处delete的{​​{1}}方法不会被执行。

该文档说,如果您要删除查询集中的所有对象并仍然调用自定义MyModel方法,则必须执行以下操作:

MyModel.delete