我需要检查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'])
由于filter
返回了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)
我认为从逻辑和效率的角度来看,最简单的方法是使用查询集的exists()函数,在此处记录:
https://docs.djangoproject.com/en/dev/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
空QuerySet的布尔值也为False,因此您也可以这样做...
...
if not user_object:
do insert or whatever etc.
您也可以使用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!
...
您可以使用:
try:
# get your models
except ObjectDoesNotExist:
# do something
如果用户存在,则可以在user_object
中获得该用户,否则user_object
将为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