Django查询返回空时该怎么办?会出错

8 投票
4 回答
11683 浏览
提问于 2025-04-15 14:56
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
  1. 顺便说一下,用户名是唯一的。所以你可以使用

    to_friend = User.objects.get(username=friend_q)
    
  2. 如果你想在用户不存在时返回404错误,那也可以,

    from django.shortcuts import get_object_or_404
    to_friend = get_object_or_404(User,username=friend_q)
    
  3. 为了避免出错,你可以把它放在try except块里,这样写很符合Python的风格。

    try:
       to_friend = User.objects.get(username=friend_q)
    except User.DoesNotExist:
       to_friend = None
    
  4. 因为这是一个常见的需求,你可以考虑在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, ...

撰写回答