当Django查询返回none时该怎么办?它给了我错误

时间:2009-10-09 09:50:41

标签: python django

to_friend = User.objects.filter(username=friend_q)[0:1]

如果'friend_q'不在User.username中......它会给出错误。 推荐的策略是什么?

谢谢

4 个答案:

答案 0 :(得分:9)

如果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, ...

答案 1 :(得分:5)

  1. FWIW,用户名是唯一的。所以你可以使用

    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除了块之外,非常pythonic。

    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的模型,这仍然是一个方便的4行功能。

答案 2 :(得分:1)

您收到错误的原因是因为您尝试在查询对象中没有任何内容时对其进行评估。最后的[0:1]试图从空列表中取出第一个项目。如果你将表达式拆分得如下,你可以在从中取出一个元素之前检查一个空列表。

to_friends = User.objects.filter(username=friend_q)
if to_friends:
    to_friend = to_friends[0]

答案 3 :(得分:-1)

to_friend = User.objects.filter(username=friend_q).first()

如果没有用户名为friend_q的用户,您将获得to_friend = None,如果有,则获得该用户