Django查询返回空时该怎么办?会出错
to_friend = User.objects.filter(username=friend_q)[0:1]
如果 'friend_q' 不在 User.username 里面,就会出错。有什么好的解决办法吗?
4 个回答
1
你遇到错误的原因是因为你在尝试使用一个空的查询对象。最后的 [0:1] 是在试图从一个空列表中取出第一个项目。如果你把这个表达式稍微拆分一下,像下面这样,你就可以在取出元素之前先检查一下列表是否为空。
to_friends = User.objects.filter(username=friend_q)
if to_friends:
to_friend = to_friends[0]
6
顺便说一下,用户名是唯一的。所以你可以使用
to_friend = User.objects.get(username=friend_q)
如果你想在用户不存在时返回404错误,那也可以,
from django.shortcuts import get_object_or_404 to_friend = get_object_or_404(User,username=friend_q)
为了避免出错,你可以把它放在try except块里,这样写很符合Python的风格。
try: to_friend = User.objects.get(username=friend_q) except User.DoesNotExist: to_friend = None
因为这是一个常见的需求,你可以考虑在UserManager里定义一个叫
get_user_or_none
的函数,其他需要返回None
的管理器也可以用类似的方式,像get_object_or_404
。这个想法曾经被考虑加入到Django的核心功能里,但最后没有被采纳,不知道是什么原因。不过,这个函数很实用,只需要四行代码,适合那些需要返回None
的模型。
10
如果 friend_q 不是数据库中的用户,那么 to_friend 就会是一个空列表。
>>> from django.contrib.auth.models import User
>>> User.objects.filter(username='does-not-exist')
[]
不过,使用 get() 方法来查找特定的条目会更好:
>>> User.objects.get(username='does-exist')
<User: does-exist>
>>> User.objects.get(username='does-not-exist')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.5/django/db/models/manager.py", line 120, in get
File "/usr/lib/python2.5/django/db/models/query.py", line 305, in get
DoesNotExist: User matching query does not exist.
这样你就可以捕捉到 DoesNotExist 这个异常,并采取相应的措施。
try:
to_friend = User.objects.get(username=friend_q)
except User.DoesNotExist:
# do something, raise error, ...