3

我有两个简单的模型:

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

class Box(Model):
    name = models.CharField()
    image = models.ForeignKey(Image, blank=True, null=True)

当我想删除 Image 的对象时,Django 对 Box 模型进行选择查询:

>> 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

我已经尝试过on_delete=models.SET_NULL,sqlite 和 PostgreSQL 也总是得到相同的结果。

4

1 回答 1

7

当 Django 删除一个对象时,它会尝试模拟相关对象的级联删除,以确保delete调用它们的方法和相关信号。请参阅https://docs.djangoproject.com/en/stable/topics/db/queries/#deleting-objects

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

使用 Django 1.5+,您可以通过将外键设置为on_delete=DO_NOTHING. 请参阅https://docs.djangoproject.com/en/stable/ref/models/querysets/#django.db.models.query.QuerySet.delete

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

于 2013-08-21T13:38:30.560 回答