如何检查一个查询集是否为空?

3
分页代码:

分页代码:

try:
    page = paginator.page(page_number)
    print(page.object_list)

以下是我的分页打印print(page.object_list)的输出结果:
<QuerySet [<Comment: I can't believe it's happeinig>, <Comment: Just trying to fill up the comments>, <Comment: Another one!>, <Comment: Evenmore noe>, <Comment: Something>, <Comment: Lol>, <Comment: Are comments showing up?>, <Comment: Great for the economy.>, <Comment: honestly>, <Comment: Even though the the onlyEven though the only one to udnertstnaf!>]>
<QuerySet [<Comment: Yeah it's crazy how fast aswell. It's very awesome how it's doing atm. >]>
<QuerySet []>
<QuerySet [<Comment: Sure>, <Comment: No worries>]>
<QuerySet []>
<QuerySet []>
<QuerySet [<Comment: attempt 2!>]>
<QuerySet [<Comment: Attempt 3!>]>
<QuerySet []>
<QuerySet [<Comment: 12>]>
<QuerySet []>
<QuerySet [<Comment: Somewhere?>]>
<QuerySet []>
<QuerySet [<Comment: lol>]>
<QuerySet []>
<QuerySet [<Comment: 12>]>
<QuerySet []>

正如您所看到的,我有一些空的查询集,这些导致我的代码出现错误。因此,我想遍历这些查询集并找出其中的空集。我尝试添加了以下for循环:

for i in page.object_list:
    if len(i) < 0:

但是我遇到了一个错误:
TypeError at /news/11/
object of type 'Comment' has no len()

需要帮助请告知。

尝试删除一个查询集(queryset),如果它是空的:

try:
    page = paginator.page(page_number)
    if page.object_list:
        pass
    else:
        page.delete()

错误:

AttributeError at /news/11/
'CustomPage' object has no attribute 'delete'  

1
在使用分页器之前,您应该先过滤查询集。 - Sayse
3个回答

5
您可以直接使用if语句测试QuerySet。这会导致对QuerySet进行评估。空的QuerySet(或空列表)是falsy的:
page = paginator.page(page_number)
if page.object_list:
    ...

如果您想迭代QuerySet,就不需要测试是否为空。只需使用for子句即可:
for obj in page.object_list: # empty QuerySet gets zero iterations
   ...

谢谢。有没有办法在else子句中删除页面?如果您查看我的编辑,我已经尝试过了,但不确定如何操作。 - Zorgan
如果它是空的,你不需要删除任何东西。Python会为您执行垃圾回收。 - Moses Koledoye
你是正确的,没有评论显示出来。但在后端中,它显示了一个空的查询集,就像你在我的原始帖子中看到的那样:<QuerySet []>。这会影响到我的包中的 has_next() 函数,因为空查询集导致其返回 False - Zorgan
如果你在循环中进行这个操作,你可以简单地使用continue来跳到下一个page_number,避免对空的QS执行任何操作。 - Moses Koledoye
让我们在聊天中继续这个讨论 - Zorgan
显示剩余2条评论

3
你可以使用exists(我强调)查询方法
page.object_list.exists()

如果QuerySet包含任何结果,则返回True,如果没有则返回False。它尝试以最简单和最快的方式执行查询,但实际上执行的查询与正常的QuerySet查询几乎相同。

exists()对于与查询集中对象成员以及查询集中任何对象的存在相关的搜索非常有用,特别是在大型查询集的情况下。

虽然,在创建分页器之前过滤查询集会更好。


0
另一种方法是:
if page.object_list.count() == 0:
  #Empty Result
else:
  #Something

虽然这样做是可行的,但如果您的object_list很大,您将运行一个潜在昂贵的查询,只是为了检查是否应该对数据进行某些操作。此外,那个count方法比在查询中使用func.count要慢。如果您真的想检查计数,我建议您执行类似于.with_entities(func.count("some_col")).scalar()的操作。 - Matthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接