如何在Django模型中删除记录?


267

我要删除特定记录。如

delete from table_name where id = 1;

我怎么能做到这一点django model


16
感谢您提出问题。有时RTFM需要花费很多时间比谷歌搜索和SO,就证明了答案的选票数,阅览数
Freedom_Ben

8
同意@Freedom_Ben,但对于以后仍然喜欢f *手册的读者,这是您正在寻找的内容:docs.djangoproject.com/en/dev/topics/db/queries/…–
Dinei

Answers:


512

有两种方法:

要直接删除它:

SomeModel.objects.filter(id=id).delete()

要从实例中删除它:

instance = SomeModel.objects.get(id=id)
instance.delete()

50
请注意,第一个不会调用对象的.delete()方法,因此,如果该方法中有“清理”代码,则不会调用该代码。通常这不是问题,但值得牢记。
Matthew Schinckel,2010年

8
@Matthew Schinckel:是的。如果要使用自定义删除方法,则应该使用pre_deletepost_delete信号。
Wolph 2010年

2
我不知道DJango 1.4之后是什么情况,但这实际上是在获取所有PK,然后由这些PK删除。因此,例如,如果您通过任意字段删除,这可能会比SQL副本慢得多... :(
Vajk Hermecz 2014年

1
@VajkHermecz:的确如此,并且由于删除信号而导致的预期行为。Django信号系统必须跟踪所有数据库更改,因为某些内容可能会与之挂钩(如还原一样)。
Wolph 2014年

3
您可以使用返回值delete()来检查要删除的内容。它返回一个带有已删除对象计数的元组和一个带有已删除类型详细信息的字典,例如(1, {'yourapp.SomeModel': 1})
mcb

37
MyModel.objects.get(pk=1).delete()

如果具有指定主键的对象不存在,这将引发异常,因为它首先会尝试检索指定的对象。

MyModel.objects.filter(pk=1).delete()

如果具有指定主键的对象不存在,并且不会直接产生查询,则不会引发异常

DELETE FROM my_models where id=1

1
错别字MyModel.object.filter(pk=1).delete()。它应该是“对象”。
奈杰尔


7

如果要删除一个实例,请编写代码

delet= Account.objects.get(id= 5)
delet.delete()

如果要删除所有实例,请编写代码

delet= Account.objects.all()
delete.delete()

6

沃尔夫提供了一个很好的答案集中代码。让我在这里粘贴官方文档,以供大家参考。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.