我想删除特定记录。如
delete from table_name where id = 1;
我怎样才能在 django 模型中做到这一点?
有几种方法:
直接删除:
SomeModel.objects.filter(id=id).delete()
要从实例中删除它:
instance = SomeModel.objects.get(id=id)
instance.delete()
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
他正在搜索主键。通常,如果您在模型中将不同的字段设置为主键,这可能是错误的
id = models.BigAutoField(primary_key=True)
中看到因此,如果您没有更改模型的默认主键,id 或 pk 起作用,因为 *pk 指的是主键。
如果要删除一个实例,请编写代码
entry= Account.objects.get(id= 5)
entry.delete()
如果要删除所有实例,请编写代码
entries= Account.objects.all()
entries.delete()
如果要删除一项
wishlist = Wishlist.objects.get(id = 20)
wishlist.delete()
例如,如果您想删除愿望清单中的所有项目
Wishlist.objects.all().delete()
将投票最多的答案延长 wolph
请注意,您应该将请求作为参数传递给视图中的删除函数。一个例子是:
from django.shortcuts import redirect
def delete(request, id):
YourModelName.objects.filter(id=id).delete()
return redirect('url_name')
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()
,但为了清楚起见,我使用了多行。
就像调用以下命令一样简单。
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;
我这样做的方式:
instance = SomeModel.objects.get(id=1)
instance.delete()
对我来说它看起来很容易理解,这就是我使用这种方法的原因。
您可以直接从管理面板中删除对象,或者还有一个选项可以通过键入 python3 manage.py shell(Linux 中的 python3)从交互式 shell 中删除特定或选定的 id。如果您希望用户通过浏览器(提供可视化界面)删除对象,例如从数据库中删除 ID 为 6 的员工,我们可以使用以下代码实现此目的,emp = employee.objects.get(id=6 )。删除()
这将删除 ID 为 6 的员工。
如果您希望删除数据库中存在的所有员工而不是 get(),请指定 all(),如下所示:employee.objects.all().delete()
您也可以使用 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。
pre_delete
或post_delete
信号。delete()
的返回值来检查您要删除的内容。它返回一个包含已删除对象计数的元组和一个包含有关已删除类型的详细信息的字典,例如(1, {'yourapp.SomeModel': 1})
。