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

TIM*_*MEX 5 python django

to_friend = User.objects.filter(username=friend_q)[0:1]
Run Code Online (Sandbox Code Playgroud)

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

谢谢

mat*_*ath 9

如果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)


Lak*_*sad 5

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

    to_friend = User.objects.get(username=friend_q)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果你想在用户不存在时提出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)
  3. 为了防止错误,你可以简单地把它放在try除了块之外,非常pythonic.

    try:
       to_friend = User.objects.get(username=friend_q)
    except User.DoesNotExist:
       to_friend = None
    
    Run Code Online (Sandbox Code Playgroud)
  4. 由于这是一个常见的要求,因此您应该考虑get_user_or_none在UserManager和其他需要None返回的管理器上进行定义,类似于get_object_or_404.这是考虑到django核心,但不包括在内,原因是什么.对于需要None退回的型号,仍然是一个方便的4线功能.