【问题标题】:For Django models, is there a shortcut for seeing if a record exists?对于 Django 模型,是否有查看记录是否存在的快捷方式?
【发布时间】:2011-02-20 16:43:36
【问题描述】:

假设我有一张表People,有没有办法快速检查是否存在名称为'Fred'People 对象?我知道我可以查询

People.objects.filter(Name='Fred')

然后检查返回结果的长度,但是有没有更优雅的方法呢?

【问题讨论】:

标签: python django django-models


【解决方案1】:

更新

正如最近的回答中提到的,从 Django 1.2 开始,您可以改用 exists() 方法 (link)。


原答案:

不要在结果上使用 len(),你应该使用People.objects.filter(Name='Fred').count()。根据 django 文档,

count() 执行 SELECT COUNT(*) 在幕后,所以你应该 总是使用 count() 而不是加载 所有记录到 Python 对象中 并在结果上调用 len() (除非您需要加载对象 无论如何都进入内存,在这种情况下 len() 会更快)。

来源:Django docs

【讨论】:

  • 当你有非常大的桌子时,我不建议对它们进行 count() 操作,因为找到所有匹配项可能需要相当长的时间(徒劳,当你只对知道时感兴趣如果至少有一个)。如果我必须这样做,我会做一个限制为 1 的选择。如果没有匹配项(最坏的情况),它仍然需要很长时间,但如果有任何记录,它会更快完成数亿倍成立。注意:此评论是针对建议的 count() 替代方案。我在更新中看到了使用 exists() 的建议,我同意这将是实际可行的方法。
【解决方案2】:

QuerySet API 中的exists() 方法可用since Django 1.2

【讨论】:

    【解决方案3】:

    从 Django 1.2 开始,您可以在 QuerySet 上使用 .exists(),但在以前的版本中,您可能会喜欢在 this ticket 中描述的非常有效的技巧。

    【讨论】:

      【解决方案4】:

      您可以使用count() 例如:

      People.objects.filter(Name='Fred').count()
      

      如果名称列是唯一的,那么您可以这样做:

      try:
        person = People.objects.get(Name='Fred')
      except (People.DoesNotExist):
        # Do something else...
      

      您也可以使用get_object_or_404() 例如:

      from django.shortcuts import get_object_or_404
      get_object_or_404(People, Name='Fred')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        • 2015-10-04
        • 2017-06-05
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        相关资源
        最近更新 更多