我正在编写一个简单的auth系统来登录(和注销)用户。用户名是一个电子邮件地址,用于查找电子邮件字段。
我正在使用:
user = User.objects.get(email__exact=email)
# if user obj exists
if user:
# if authenticate
if authenticate(user, email, password):
# create session
request.session['user'] = user
# redir
return HttpResponseRedirect('/home/')
else:
return HttpResponseRedirect('/home/login/')
# no user obj found? (no email found actually)
else:
# redir
return HttpResponseRedirect('/home/')
查找用户是否存在,但是如果找不到用户,则Django会抛出错误:
User matching query does not exist.
我想要做的就是查看该查询是否与结果匹配。我如何计算行?
答案 0 :(得分:2)
使用filter()
代替get()
。
答案 1 :(得分:1)
我认为这可能更符合您的要求:
try:
user = User.objects.get(email__exact=email)
if authenticate(user, email, password):
request.session['user'] = user
return HttpResponseRedirect('/home/')
else:
return HttpResponseRedirect('/home/login/')
except User.DoesNotExist: # A user with the e-mail provided was not found
return HttpResponseRedirect('/home/')
就我个人而言,我认为这比伊格纳西奥的方法更清洁,但这确实是一个品味问题。
最后,问题的最后一部分(“我如何计算行?”):
get
只返回一个对象,如果没有对象与您传入的条件匹配,或者多个对象符合条件,则会引发异常。要获得QuerySet
中的对象数量,您只需在其上调用len
:
q = User.objects.filter(email = 'foo@bar.com')
print len(q)
或者,致电count()
:
print User.objects.filter(email = 'foo@bar.com').count()
如果您已经评估了len
(因为它只是有效地计算列表中的项目数),前一种方法(QuerySet
)会更快;如果你没有评估count()
,后者(QuerySet
)会更快,因为Django将在幕后执行SELECT COUNT(*)
,并且你避免将所有数据加载到内存中。 / p>
顺便说一句 - 如果电子邮件地址不匹配,为什么要将它们指向/home/
,如果其凭据失败,为什么指示/home/login/
?我认为将这两种情况重定向到同一个地方更有意义。