【问题标题】:Django: Catching Integrity Error vs qs.exists() which one is more efficient?Django:捕获完整性错误与 qs.exists() 哪个更有效?
【发布时间】:2018-12-29 13:58:30
【问题描述】:

判断是否存在相同数据的两种方法:

1

try:
    MyModel.objects.create(
        field1=field1_value,
        field2=field1_value,
    )
except IntegrityError:
    # doing something

2

qs = MyModel.objects.filter(field1=field1_value, field2=field2_value)
if qs.exists():
    # doing something

我想知道哪种方法更适合检查完整性。

【问题讨论】:

  • 完整性错误可能意味着其他事情,而不仅仅是已经存在这样的字段这一事实。例如非法外键等

标签: django django-queryset


【解决方案1】:

Try-Except 不如 if-else 语句效率...但它更可取,因为它的多功能性和以下几点...所以答案真的取决于您的用例...如果您尝试运行高性能实时应用程序 if-else 更好,但是如果您正在编写一个通用库,而您不知道会发生什么故障或如何如果用户想要处理它,那么 Try-Except 就更好了。

您可以通过 Try-Except 块访问 Finally

Except 不会在遇到错误时停止代码停止,如果您正在处理狭窄的异常类型,这尤其可取。

此外,您不必预测代码块中何时发生异常,就像在 if else 语句的情况下必须预测的那样。那就是..

try:
    # do some things before
    MyModel.objects.create(
        field1=field1_value,
        field2=field1_value,
    )
    # do some things after
except IntegrityError:
    # catch the exception regardless of where in the Try Block the failure occured

但是,在 if 语句的情况下,您必须预测故障点将出现在 MyModels.objects.create() 调用处,这是一个可以轻松避免的潜在错误。

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2015-05-29
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多