【问题标题】:Django model `get` does not return false [duplicate]Django模型`get`不返回false [重复]
【发布时间】:2016-04-13 03:49:42
【问题描述】:

我有一个 Django 应用程序,它检查数据库是否包含与用户在表单中输入的数字相匹配的数字。如果它们匹配,我已经设法让它重定向到“你赢”页面,但是当它们不匹配时,它只会给出一个错误,说“匹配查询不存在”。这是我在 view.py 文件中使用的 if/else 语句:

if Numbers.objects.get(numbers_win = user_number):
     return HttpResponseRedirect('win')
else:
     return HttpResponseRedirect('lose.html')

【问题讨论】:

标签: python django django-views


【解决方案1】:

那是因为.get 在没有匹配项时抛出异常——它不会返回错误的东西。

你有两个选择:

首先,您可以使用filterexists 而不是get,如果找到,则返回True,否则返回False

如果您不使用结果,这可能是最好的解决方案:

if Numbers.objects.filter(numbers_win = user_number).exists():
     return HttpResponseRedirect('win')
else:
     return HttpResponseRedirect('lose.html')

(如 cmets 中所述,using exists is faster if you're just checking for existence

其次,您可以捕获异常,而不是使用if / else

try:
    Numbers.objects.get(numbers_win = user_number)
except Numbers. DoesNotExist:
    return HttpResponseRedirect('lose.html')
else:  
    return HttpResponseRedirect('win')

不过,正如您所看到的,这会产生一些尴尬的代码,而且它的性能也比使用 .exists 更差,所以您可能不应该这样做。

【讨论】:

  • 实际上,如果 OP 想要验证项目是否在数据库中,他们应该使用 .filter(...).exists()
  • 谢谢@DanielRoseman;更正
  • 如果你将 get 调用的结果分配到一个变量中并在 else 语句中使用它,它会执行得更好,这可能是用户想要做的。
  • @jpic 当然;这就是“如果您没有以其他方式使用结果”注释地址的内容(在问题中,他们实际上并没有使用get 调用的结果)。
  • 谢谢!这确实很有意义。
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2020-04-06
  • 2014-01-10
相关资源
最近更新 更多