Что делать, если запрос Django не возвращает ничего? Это дает мне ошибку - PullRequest
5 голосов
/ 09 октября 2009
to_friend = User.objects.filter(username=friend_q)[0:1]

Если «friend_q» НЕ находится внутри User.username ... это выдаст ошибку. Какая тактика рекомендуется?

Спасибо

Ответы [ 4 ]

9 голосов
/ 09 октября 2009

Если 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, ...
5 голосов
/ 09 октября 2009
  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:
       to_friend = User.objects.get(username=friend_q)
    except User.DoesNotExist:
       to_friend = None
    
  4. Поскольку это общее требование, вам следует рассмотреть возможность определения get_user_or_none в UserManager и других менеджерах, которым потребуется возврат None, аналогично get_object_or_404. Это было рассмотрено для ядра django, но не было включено, по какой-либо причине. Тем не менее, это удобная четырехстрочная функция для моделей, которым требуется None назад.

1 голос
/ 09 октября 2009

Причина, по которой вы получаете ошибку, заключается в том, что вы пытаетесь оценить объект Query, когда в нем ничего нет. [0: 1] в конце пытается извлечь первый элемент из пустого списка. Если вы разделите выражение, как показано ниже, вы можете проверить наличие пустого списка, прежде чем извлекать из него элемент.

to_friends = User.objects.filter(username=friend_q)
if to_friends:
    to_friend = to_friends[0]
0 голосов
/ 10 мая 2018
to_friend = User.objects.filter(username=friend_q).first()

если нет пользователя с именем friend_q, вы получите to_friend = None, если есть, вы получите пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...