86

我需要检查是否Model.objects.filter(...)出现了任何东西,但不需要插入任何东西。到目前为止,我的代码是:

user_pass = log_in(request.POST)  # form class
if user_pass.is_valid():
    cleaned_info = user_pass.cleaned_data
    user_object = User.objects.filter(email = cleaned_info['username'])
4

6 回答 6

171

我认为从逻辑和效率的角度来看,最简单的方法是使用查询集的exists()函数,记录在这里:

https://docs.djangoproject.com/en/stable/ref/models/querysets/#django.db.models.query.QuerySet.exists

所以在你上面的例子中,我会简单地写:

if User.objects.filter(email = cleaned_info['username']).exists():
    # at least one object satisfying query exists
else:
    # no object satisfying query exists
于 2014-02-13T09:48:41.270 回答
74

由于filter返回 a QuerySet,您可以使用count检查返回了多少结果。这是假设您实际上并不需要结果。

num_results = User.objects.filter(email = cleaned_info['username']).count()

不过,在查看文档之后,如果您打算稍后使用结果,最好只在过滤器上调用 len,因为您只会进行一个 sql 查询:

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

num_results = len(user_object)
于 2012-07-30T02:04:20.027 回答
7

空 QuerySet 的布尔值也是 False,所以你也可以这样做......

...
if not user_object:
   do insert or whatever etc.
于 2012-07-30T04:06:01.153 回答
6

您也可以使用get_object_or_404()Http404 ,如果找不到对象,它将引发 a :

user_pass = log_in(request.POST) #form class
if user_pass.is_valid():
    cleaned_info = user_pass.cleaned_data
    user_object = get_object_or_404(User, email=cleaned_info['username'])
    # User object found, you are good to go!
    ...
于 2012-07-30T02:11:29.133 回答
4

您可以使用:

try:
   # get your models
except ObjectDoesNotExist:
   # do something
于 2015-10-01T09:50:24.700 回答
4

如果用户存在,你可以让用户进入user_objectelse user_objectwill be None

try:
    user_object = User.objects.get(email = cleaned_info['username'])
except User.DoesNotExist:
    user_object = None
if user_object:
    # user exist
    pass
else:
    # user does not exist
    pass
于 2019-02-18T08:15:35.010 回答