代码之家  ›  专栏  ›  技术社区  ›  Niklas

检查Django中的空查询集

  •  280
  • Niklas  · 技术社区  · 17 年前

    检查查询是否返回任何结果的推荐习惯用法是什么?

    orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
    # If any results
        # Do this with the results without querying again.
    # Else, do something else...
    

    我想有几种不同的方法可以检查这一点,但我想知道一个有经验的Django用户会怎么做。 文档中的大多数示例都忽略了未找到任何内容的情况。..

    7 回复  |  直到 17 年前
        1
  •  143
  •   Adam    17 年前
    if not orgs:
        # The Queryset is empty ...
    else:
        # The Queryset has results ...
    
        2
  •  160
  •   Leonid Shvechikov    9 年前

    从1.2版本开始,Django就有了QuerySet。 exists() 最有效的方法是:

    if orgs.exists():
        # Do this...
    else:
        # Do that...
    

    但是,如果你无论如何都要评估QuerySet,最好使用:

    if orgs:
       ...
    

    更多信息 read QuerySet.exists() documentation .

        3
  •  15
  •   Adam Playford    16 年前

    要检查查询集的空性,请执行以下操作:

    if orgs.exists():
        # Do something
    

    或者,您可以检查查询集中的第一个项目,如果它不存在,它将返回 None :

    if orgs.first():
        # Do something
    
        4
  •  10
  •   Tuss4    11 年前

    如果你有大量的对象,这(有时)会快得多:

    try:
        orgs[0]
        # If you get here, it exists...
    except IndexError:
        # Doesn't exist!
    

    在我正在进行的一个大型数据库项目中, not orgs 为400+ms orgs.count()

    当然,可能需要更长的时间,这取决于数据库在查找结果时需要花费多少时间。或者更快,如果它很快找到的话;YMMV。

    通常比

        5
  •  6
  •   dzida    13 年前

    最有效的方法(在django 1.2之前)是这样的:

    if orgs.count() == 0:
        # no results
    else:
        # alrigh! let's continue...
    
        6
  •  5
  •   hedleyroos    15 年前

    我不同意这个断言

    if not orgs:
    

    应该是

    if not orgs.count():
    

        7
  •  0
  •   Rupesh Chaudhari    7 年前

    你也可以使用这个:

    if(not(orgs)): #if orgs is empty else: #if orgs is not empty