【发布时间】:2011-02-20 16:43:36
【问题描述】:
假设我有一张表People,有没有办法快速检查是否存在名称为'Fred' 的People 对象?我知道我可以查询
People.objects.filter(Name='Fred')
然后检查返回结果的长度,但是有没有更优雅的方法呢?
【问题讨论】:
标签: python django django-models
假设我有一张表People,有没有办法快速检查是否存在名称为'Fred' 的People 对象?我知道我可以查询
People.objects.filter(Name='Fred')
然后检查返回结果的长度,但是有没有更优雅的方法呢?
【问题讨论】:
标签: python django django-models
更新:
正如最近的回答中提到的,从 Django 1.2 开始,您可以改用 exists() 方法 (link)。
原答案:
不要在结果上使用 len(),你应该使用People.objects.filter(Name='Fred').count()。根据 django 文档,
count() 执行 SELECT COUNT(*) 在幕后,所以你应该 总是使用 count() 而不是加载 所有记录到 Python 对象中 并在结果上调用 len() (除非您需要加载对象 无论如何都进入内存,在这种情况下 len() 会更快)。
来源:Django docs
【讨论】:
QuerySet API 中的exists() 方法可用since Django 1.2。
【讨论】:
从 Django 1.2 开始,您可以在 QuerySet 上使用 .exists(),但在以前的版本中,您可能会喜欢在 this ticket 中描述的非常有效的技巧。
【讨论】:
您可以使用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')
【讨论】: