为什么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可能会采取快速路径,删除对象而不将其读入内存。对于大型删除,这可能会显著减少内存使用。执行的查询量也可以减少