Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么模型的定制delete()函数不能在Django中执行?_Python_Django_Django Models - Fatal编程技术网

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

Python 为什么模型的定制delete()函数不能在Django中执行?,python,django,django-models,Python,Django,Django Models,如何理解Django官方文件中的以下陈述 请记住,只要可能,这将完全在SQL中执行,因此在该过程中不必调用单个对象实例的delete()方法。如果您在模型类上提供了自定义的delete()方法,并希望确保调用该方法,则需要“手动”删除该模型的实例(例如,通过迭代查询集并分别对每个对象调用delete()),而不是使用批量delete()查询集的方法 在大多数情况下,我们仍然需要在自定义的delete()函数中调用超类中的原始delete()函数。为什么由于底层SQL,可能无法执行自定义版本的de

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

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


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

如果调用
Foo.objects.all().delete()
(查询集),则无法使用

如果你打电话的话,我会工作的

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

(单个对象)

对于名为
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
    
    这里将不执行
    MyModel
    delete
    方法

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

for q in qs:
    q.delete()

了解了!它是具有相同签名的函数,但属于两个类:MyModel和QuerySet。