2009-10-09 2 views

답변

9

friend_q가 데이터베이스에있는 사용자가 아닌 경우 to_friend는 빈 목록과 같습니다.

>>> from django.contrib.auth.models import User 
>>> User.objects.filter(username='does-not-exist') 
[] 

그러나, 특정 항목을 조회하기 위해 GET() 메소드를 사용하는 것이 좋습니다 : 이제 DoesNotExist 예외를 캐치하고 적절한 조치를 취할 수 있습니다

>>> 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. 

.

try: 
    to_friend = User.objects.get(username=friend_q) 
except User.DoesNotExist: 
    # do something, raise error, ... 
0

오류를 얻고있는 이유는 감사드립니다. 끝에있는 [0 : 1]은 첫 번째 항목을 빈 목록에서 제거하려고 시도하고 있습니다. 아래와 같이 표현을 나누면, 요소를 빼기 전에 빈리스트를 검사 할 수 있습니다.

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

"to_friends [0]"은 단일 객체를 산출하지만 op 코드 '[0 : 1]'은 단일 객체가있는 목록을 생성합니다. 꽤 똑같은 것은 아닙니다!) - –

+0

to_friends는 결코 None이 아닙니다. 여전히 결과를 반환하지 않는 쿼리 개체입니다. –

+0

아, 또한 None 개체가 싱글 톤으로 제공되므로 신원 비교를 사용하는 것이 좋습니다. 예 : "to_friends가 None이 아닌 경우 :" –

5
  1. FWIW는, 사용자 이름은 고유합니다. 그래서 U이

    from django.shortcuts import get_object_or_404 
    to_friend = get_object_or_404(User,username=friend_q) 
    
  2. 하는 오류를 방지하려면 사용자가 존재하지 않는 경우 404를 제기하려면

    to_friend = User.objects.get(username=friend_q) 
    
  3. 를 사용하면 수도뿐만 아니라 수 있습니다, 당신은 단순히에 넣어 수 있습니다 블록을 제외하고 시도, 매우 pythonic. 이것은 일반적인 요구 사항이기 때문에

    try: 
        to_friend = User.objects.get(username=friend_q) 
    except User.DoesNotExist: 
        to_friend = None 
    
  4. , 당신은 UserManager에 get_user_or_none을 정의 고려하고 get_object_or_404 유사 None 반환을 필요로하는 다른 관리자한다. 이것은 장고 코어를 고려한 것이었지만 포함되지 않았습니다. 그 이유는 무엇입니까. 그래도 None이 필요한 모델의 경우 편리한 4 줄 기능입니다.

관련 문제