2009-10-09 23 views

Trả lời

9

Nếu friend_q không phải là người dùng có trong cơ sở dữ liệu, to_friend sẽ bằng danh sách trống.

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

Tuy nhiên, nó tốt hơn để sử dụng phương thức get() để tra cứu một mục cụ thể:

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

Bây giờ bạn có thể bắt các ngoại lệ DoesNotExist và có những hành động thích hợp.

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

Lý do bạn gặp phải lỗi là vì bạn đang cố gắng đánh giá đối tượng Truy vấn khi không có gì trong đó. [0: 1] ở cuối là cố gắng lấy mục đầu tiên ra khỏi danh sách trống. Nếu bạn chia nhỏ biểu thức một chút như dưới đây, bạn có thể kiểm tra danh sách trống trước khi lấy một phần tử ra khỏi nó.

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

"to_friends [0]" sẽ sinh ra một đối tượng duy nhất, trong khi mã op '[0: 1]' cho ra một danh sách với một đối tượng duy nhất trong đó. Không hoàn toàn giống nhau! -) –

+0

to_friends sẽ không bao giờ là Không - nó vẫn sẽ là đối tượng truy vấn không trả về kết quả nào. –

+0

Ồ, và cũng vậy, đối tượng Không được che chắn để trở thành một singleton, vì vậy bạn nên sử dụng so sánh danh tính, ví dụ: "if to_friends is not None:" –

5
  1. FWIW, Username là duy nhất. Vì vậy, U có thể sử dụng

    to_friend = User.objects.get(username=friend_q) 
    
  2. Nếu bạn muốn nâng cao một 404 khi người dùng không tồn tại, bạn có thể là tốt,

    from django.shortcuts import get_object_or_404 
    to_friend = get_object_or_404(User,username=friend_q) 
    
  3. Để ngăn chặn lỗi, bạn có thể chỉ cần đặt nó trong các thử trừ khối, rất pythonic.

    try: 
        to_friend = User.objects.get(username=friend_q) 
    except User.DoesNotExist: 
        to_friend = None 
    
  4. Vì đây là một yêu cầu chung, bạn nên xem xét việc xác định get_user_or_none trên UserManager, và người quản lý khác mà sẽ yêu cầu None trở lại, tương tự như get_object_or_404. Điều này đã được xem xét cho lõi django, nhưng không được bao gồm, cho những gì bao giờ là lý do. Tuy nhiên, là một chức năng 4 dòng tiện dụng cho các mô hình cần None quay lại.

Các vấn đề liên quan