检查对象是否存在


69

我需要检查是否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'])

1
我不明白你要做什么。您是否要检查用户是否已经存在以引发错误?为什么需要检查?以及为什么要在“表单视图”中执行此操作?尝试回答这个问题,看看我们是否可以为您提供更好的帮助...为您的问题添加上下文,而不仅仅是您想到的问题。有时您认为您遇到的问题不是真正的问题,因此您提出的问题不是正确的……
marianobianchi 2012年

Answers:


64

由于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)

91
.count()正常工作的同时,您也可以使用.exists()docs.djangoproject.com/zh-CN/dev/ref/models/querysets/#exists
Derek Kwok)

3
我要在上面的评论中添加一点,尽管.count()确实起作用,但如果count> 1,它将比.exists()慢,而count越大,它将变得越慢
Bob


7

空QuerySet的布尔值也为False,因此您也可以这样做...

...
if not user_object:
   do insert or whatever etc.

4
这不是很有效,因为它将评估查询,并且当对象确实存在时,会将它们加载到内存中
-mpaf

6

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

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!
    ...

4

您可以使用:

try:
   # get your models
except ObjectDoesNotExist:
   # do something

2

如果用户存在,你可以在用户user_object否则user_objectNone

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.