【问题标题】:Is it safe to delete a Django QuerySet that may be empty?删除可能为空的 Django QuerySet 是否安全?
【发布时间】:2021-12-29 16:21:28
【问题描述】:

尝试删除可能为空的 QuerySet 是否安全?换句话说,如果我不确定“MJ”这个名字是否存在,这两种方法之间有什么功能区别吗?是首选吗?

1)

query = m.objects.filter(name="MJ")
if query.exists():
    query.get().delete()
m.objects.filter(name="MJ").delete()

【问题讨论】:

  • 在此查询中,您尝试检索模型 m 中具有 "MJ" 作为 name 字段值的所有对象。所以,如果你所说的安全,你的意思是“我要毁掉我的模型吗?”不,你不会发现问题。但是,您确定不会删除模型其他字段中包含的其他信息吗?我先去检查一下。
  • 第二种方法更好,您也可以使用m.objects.filter(name="MJ").first().delete() 删除第一次出现的实例。

标签: django django-models django-queryset


【解决方案1】:

是的.get() 将尝试检索单个对象,如果有多个这样的对象,它将引发错误。

此外,如果只有一条记录,第一个变体将进行三个查询:首先检查是否存在至少一条记录,然后获取该记录,最后进行删除调用,这也可能导致删除触发器。

第二个将删除获取它将删除的对象的主键,运行删除触发器并最终删除这些对象。因此效率更高。此外,如果不存在这样的记录,或者MJname的多个对象,它将删除这些对象,因此更不容易出错,效率更高。

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 2021-05-25
    • 2020-10-01
    • 2019-04-04
    • 2018-08-06
    • 2021-05-07
    • 2010-10-07
    相关资源
    最近更新 更多