to_friend = User.objects.filter(username=friend_q)[0:1]
Run Code Online (Sandbox Code Playgroud)
如果'friend_q'不在User.username中...它将给出错误.推荐的策略是什么?
谢谢
如果friend_q不是数据库中存在的用户,则to_friend将等于空列表.
>>> from django.contrib.auth.models import User
>>> User.objects.filter(username='does-not-exist')
[]
Run Code Online (Sandbox Code Playgroud)
但是,最好使用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.
Run Code Online (Sandbox Code Playgroud)
您现在可以捕获DoesNotExist异常并采取适当的操作.
try:
to_friend = User.objects.get(username=friend_q)
except User.DoesNotExist:
# do something, raise error, ...
Run Code Online (Sandbox Code Playgroud)
FWIW,用户名是唯一的.所以你可以使用
to_friend = User.objects.get(username=friend_q)
Run Code Online (Sandbox Code Playgroud)如果你想在用户不存在时提出404,你也可以,
from django.shortcuts import get_object_or_404
to_friend = get_object_or_404(User,username=friend_q)
Run Code Online (Sandbox Code Playgroud)为了防止错误,你可以简单地把它放在try除了块之外,非常pythonic.
try:
to_friend = User.objects.get(username=friend_q)
except User.DoesNotExist:
to_friend = None
Run Code Online (Sandbox Code Playgroud)由于这是一个常见的要求,因此您应该考虑get_user_or_none在UserManager和其他需要None返回的管理器上进行定义,类似于get_object_or_404.这是考虑到django核心,但不包括在内,原因是什么.对于需要None退回的型号,仍然是一个方便的4线功能.