ChatGPT解决这个技术问题 Extra ChatGPT

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

我想删除特定记录。如

delete from table_name where id = 1;

我怎样才能在 django 模型中做到这一点?

同意@Freedom_Ben,但对于喜欢 f* 手册的未来读者来说,这就是您要寻找的:docs.djangoproject.com/en/dev/topics/db/queries/…

W
Wolph

有几种方法:

直接删除:

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

要从实例中删除它:

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

请注意,第一个不会调用对象的 .delete() 方法,因此如果该方法中有“清理”代码,它将不会被调用。通常不是问题,但值得牢记。
@Matthew Schinckel:这是真的。如果您想使用自定义删除方法,则应该使用 pre_deletepost_delete 信号。
我不知道 DJango 1.4 之后是什么情况,但这实际上是获取所有 PK,然后被这些 PK 删除。因此,例如,如果您通过任意字段删除,这可能会比 SQL 对应项慢得多... :(
@VajkHermecz:这是正确的,并且是由于删除信号而导致的预期行为。 Django 信号系统必须跟踪所有数据库更改,因为某些东西可能会与它挂钩(例如 reversion)。
您可以使用 delete() 的返回值来检查您要删除的内容。它返回一个包含已删除对象计数的元组和一个包含有关已删除类型的详细信息的字典,例如 (1, {'yourapp.SomeModel': 1})
M
Milad Khodabandehloo
MyModel.objects.get(pk=1).delete()

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

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

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

DELETE FROM my_models where id=1

您使用了 pk,@Wolph 使用了 id。有什么区别?
使用 pk,您正在使用表主键进行过滤。我认为@Milad 假设由于@Wolf 使用 id 他正在搜索主键。通常,如果您在模型中将不同的字段设置为主键,这可能是错误的
@Gathide 您可以在 django docs.djangoproject.com/en/3.2/topics/db/models/that id = models.BigAutoField(primary_key=True) 中看到因此,如果您没有更改模型的默认主键,idpk 起作用,因为 *pk 指的是主键。
C
ColeDrain

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

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

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

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

A
Ahmed Adewale

如果要删除一项

wishlist = Wishlist.objects.get(id = 20)
wishlist.delete()

例如,如果您想删除愿望清单中的所有项目

Wishlist.objects.all().delete()

K
KhairulBashar

将投票最多的答案延长 wolph

请注意,您应该将请求作为参数传递给视图中的删除函数。一个例子是:

from django.shortcuts import redirect


def delete(request, id):
YourModelName.objects.filter(id=id).delete()

return redirect('url_name')

哪个是“投票最多的评论”?最好是您引用它,例如由它的作者引用,因为它可能不会永远保持“顶级”。
Z
Zoe stands with Ukraine

delete() 方法用于从数据库中删除模型实例。此方法会立即删除对象。此方法返回已删除对象的数量。

例子:

删除一条记录:

data_to_be_deleted = Modelname.objects.get(fieldname = value)
data_to_be_deleted.delete()

由于 get 方法从查询集中返回单个对象,因此只会删除单个记录。如果提供的值不存在,这将引发错误。如果表中有多个相同值的记录,那么它也会引发错误,所以好的做法是在使用 get 时使用单个唯一值。

根据条件删除多条记录:

对于基于条件的删除过滤方法,在查询集上使用,然后调用删除。

data_to_be_deleted = Modelname.objects.filter(fieldname = value)
data_to_be_deleted.delete()

删除所有记录:

要从数据库表中删除所有模型实例/记录,您需要在 all 上调用 delete 方法

data_to_be_deleted = Modelname.objects.all()
data_to_be_deleted.delete()

注意:代码可以单行写成Modelname.objects.all().delete(),但为了清楚起见,我使用了多行。


R
Radwan Abu-Odeh

就像调用以下命令一样简单。

SomeModel.objects.get(pk=1).delete()
# Or
SomeModel.objects.filter(pk=1).delete()

# SQL equivalent
# delete from table_name where id = 1;

如果您想根据 id 删除多条记录,请使用 __in 查询 lookup

SomeModel.objects.fitler(pk__in=[1,2,3,4,5,...]).delete()

# SQL equivalent
# delete from table_name where id in (1,2,4,5,...);

如果您想删除所有记录,请使用 .all() 检索所有查询,然后使用 .delete()

SomeModel.objects.all().delete()

# SQL equivalent
# delete from table_name;

Z
Zoe stands with Ukraine

我这样做的方式:

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

instance.delete()

对我来说它看起来很容易理解,这就是我使用这种方法的原因。


B
B S Mahesh Kumar

您可以直接从管理面板中删除对象,或者还有一个选项可以通过键入 python3 manage.py shell(Linux 中的 python3)从交互式 shell 中删除特定或选定的 id。如果您希望用户通过浏览器(提供可视化界面)删除对象,例如从数据库中删除 ID 为 6 的员工,我们可以使用以下代码实现此目的,emp = employee.objects.get(id=6 )。删除()

这将删除 ID 为 6 的员工。

如果您希望删除数据库中存在的所有员工而不是 get(),请指定 all(),如下所示:employee.objects.all().delete()


S
Sunderam Dubey

您也可以使用 get_object_or_404(),而不是直接使用 get(),因为在使用 get() 时,我们会显式引发 404 错误。

但是,在使用 get_object_or_404 时,它会自动完成。

get_object_or_404 根据 4.0 文档,在给定模型管理器上调用 get(),但它引发 Http404 而不是模型的 DoesNotExist 异常。

像这样使用它:

对于批量删除:

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

要删除单个实例,请按以下方式使用 get_object_or_404() 而不是 get()

instance=get_object_or_404(anyModel,id=id)
instance.delete()

如果,未找到会自动引发 404。