Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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
为什么Django ORM在删除对象之前进行选择查询?_Django_Orm - Fatal编程技术网

为什么Django ORM在删除对象之前进行选择查询?

为什么Django ORM在删除对象之前进行选择查询?,django,orm,Django,Orm,我有两个简单的模型: class Image(Model): photo = models.CharField() class Box(Model): name = models.CharField() image = models.ForeignKey(Image, blank=True, null=True) 当我想删除图像的对象时,Django对长方体模型进行选择查询: >> Image.objects.all()[0].delete() >

我有两个简单的模型:

class Image(Model):
    photo = models.CharField()

class Box(Model):
    name = models.CharField()
    image = models.ForeignKey(Image, blank=True, null=True)
当我想删除图像的对象时,Django对长方体模型进行选择查询:

>> Image.objects.all()[0].delete()

>> print len(connection.queries)

2

>> connection.queries

{u'time': u'0.000', u'sql': u'QUERY = u\'SELECT "box"."id", ... FROM "box" WHERE "image"."image_id" IN (%s)\' - PARAMS = (1,)'}
{u'time': u'0.000', u'sql': u'QUERY = u\'DELETE FROM "image" WHERE "id" IN (%s)\' - PARAMS = (1,)'}
Django 1.6b2


我已经尝试过在_delete=models上使用
。将_NULL设置为
,同时使用sqlite和PostgreSQL总是得到相同的结果。

当Django删除一个对象时,它会尝试模拟相关对象的级联删除,以确保调用它们的
delete
方法和相关信号。看


当Django删除一个对象时,默认情况下它会模拟DELETE CASCADE上SQL约束的行为——换句话说,任何外键指向要删除的对象的对象都会随之删除

使用Django 1.5+,您可以通过在_delete=DO _NOTHING上将外键设置为
,来快速执行删除操作。看

Django需要将对象提取到内存中以发送信号和处理级联。然而,如果没有级联和信号,那么Django可能会采取快速路径,删除对象而不将其读入内存。对于大型删除,这可能会显著减少内存使用。执行的查询量也可以减少


当Django删除一个对象时,它会尝试模拟相关对象的级联删除,以确保调用它们的
delete
方法和相关信号。看


当Django删除一个对象时,默认情况下它会模拟DELETE CASCADE上SQL约束的行为——换句话说,任何外键指向要删除的对象的对象都会随之删除

使用Django 1.5+,您可以通过在_delete=DO _NOTHING
上将外键设置为
,来快速执行删除操作。看

Django需要将对象提取到内存中以发送信号和处理级联。然而,如果没有级联和信号,那么Django可能会采取快速路径,删除对象而不将其读入内存。对于大型删除,这可能会显著减少内存使用。执行的查询量也可以减少