Django查询中检查是否存在任何结果

115
在Django中如何检查是否存在与查询匹配的任何条目。
sc=scorm.objects.filter(Header__id=qp.id)

这就是在php中的做法。

if(mysql_num_rows($resultn)) {
    // True condition
    }
else {
    // False condition
    }

5个回答

235

30
这应该被接受作为答案。exists() 通常比 count() 快得多。 - frmdstryr
2
它似乎比.objects.get(pk=...)路线更快。 - Brad Solomon

119
你可以使用exists()函数:
if scorm.objects.filter(Header__id=qp.id).exists():
    ....

如果QuerySet包含任何结果,则返回True,否则返回False。它尝试以最简单和最快的方式执行查询,但实际上执行的查询与普通的QuerySet查询几乎相同。
旧版本(<1.2):使用count()
sc=scorm.objects.filter(Header__id=qp.id)

if sc.count() > 0:
   ...

len()相比的优势在于,QuerySet尚未被评估:

count()在后台执行SELECT COUNT(*),因此您应始终使用count()而不是将所有记录加载到Python对象中并在结果上调用len()

考虑到这一点,了解何时评估QuerySets可能会很有价值。


如果您使用get(),例如scorm.objects.get(pk=someid),并且对象不存在,则会引发ObjectDoesNotExist异常:
from django.core.exceptions import ObjectDoesNotExist
try:
    sc = scorm.objects.get(pk=someid)
except ObjectDoesNotExist:
    print ...

57
如果 scorm.objects.filter(Header__id=qp.id).exists() 返回为真,则... - Alexander Lebedev
@Alex Lebedev:是的,这种方法将在Django 1.2中可用。谢谢。 - Felix Kling

1
Django提供了一个方法叫做exists()来检查查询结果是否存在。exists()方法返回'True'或'False'。
Class Company(models.Model):
      name = models.CharField(max_length=100)
      year_established = models.DateField()

Class Car(models.Model):
     name = models.CharField(max_length=100)
     company = models.ForeignKey(Company,related_name='car_company',on_delete=models.CASCADE)

以下是使用exists()方法的查询:
1. Car.objects.filter(name='tesla').exists()  
2. Company.objects.filter(year_established='date').exists()

在相关领域中使用exists - 这里是外键

  1. Car.objects.filter(company__name='tesla').exists()

您可以使用任何可用的过滤器并使用 exists() 方法。


0

len(queryset) 也可以。

sc = scorm.objects.filter(Header__id=qp.id)

if len(sc):
    ....

1
在查询集上不应使用 length.count().exists() 更好,但性能较差。尽管如果您想检索查询中元素的数量,则 .count() 可以很有用。 - Léo Chaz Maltrait

0

这对我有用!

如果 some_queryset.objects.all().exists(): print("这个表不是空的")


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