【问题标题】:Why the customized delete() function of the model may not be executed in Django?为什么模型的自定义delete()函数可能无法在Django中执行?
【发布时间】:2017-02-14 08:38:35
【问题描述】:

如何理解Django官方文档中的以下语句?

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

在大多数情况下,我们仍然需要在自定义的delete() 函数中调用超类中原有的delete() 函数。为什么定制版的delete()函数可能会因为底层SQL而无法执行?提到批量操作是什么意思?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

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

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

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

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

      这里不会执行MyModeldelete方法。

    文档说,如果您想删除查询集中的所有对象并仍然调用您的自定义 MyModel.delete 方法,那么您必须这样做:

    for q in qs:
        q.delete()
    

    【讨论】:

    • 得到它!它是具有相同签名但属于 MyModel 和 QuerySet 两个类的函数。
    【解决方案2】:

    如果您调用 Foo.objects.all().delete()(一个 QuerySet)将无法正常工作。

    如果你打电话会工作

    for foo in Foo.objects.all():
        foo.delete()
    

    (单个对象)

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      相关资源
      最近更新 更多