2009-10-09 28 views

cevap

9

Eğer friend_q veritabanında bir kullanıcı bulunmuyorsa, to_friend boş bir listeye eşit olacaktır.

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

Ancak, belirli bir girdiyi arama için olsun() yöntemini kullanmak daha iyidir: Artık DoesNotExist durum yakalamak ve uygun önlemleri alabilir

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

. [1 0] 'içinde tek bir nesne ile bir listesini verir OP kod ise

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

Eğer bir hata alıyorsanız nedenidir ederiz. Sonunda [0: 1] ilk öğeyi boş bir listeden çıkarmaya çalışıyor. İfadeyi aşağıda olduğu gibi biraz ayırırsanız, bir öğe almadan önce boş bir liste olup olmadığını kontrol edebilirsiniz.

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

"to_friends [0]", tek bir nesne verecektir. Tam olarak aynı şey değil! -) –

+0

to_friends asla Hiçbiri olmayacak - sonuç hala hiçbir sonuç döndürmeyen bir sorgu nesnesi olacak. –

+0

Oh ve ayrıca, None nesnesi tekil olarak garantilidir, bu nedenle kimlik karşılaştırmasını kullanarak daha iyi olursunuz, yani: "to_friends, None değilse:" –

5
  1. FWIW, adı benzersizdir. Yani U

    from django.shortcuts import get_object_or_404 
    to_friend = get_object_or_404(User,username=friend_q) 
    
  2. hatayı önlemek için, kullanıcı yok olduğunda bir 404 yükseltmek istiyorsanız

    to_friend = User.objects.get(username=friend_q) 
    
  3. kullandığınızda, olabilir de olabilir, sadece koymak olabilir blok hariç, çok pythonic denemek. Bu ortak bir gereklilik olduğu için

    try: 
        to_friend = User.objects.get(username=friend_q) 
    except User.DoesNotExist: 
        to_friend = None 
    
  4. , sen UserManager üzerinde get_user_or_none tanımlayan düşünün ve get_object_or_404 benzer None dönüşü, gerektirecektir diğer yöneticiler olmalıdır. Bu, django çekirdeği için düşünülmüştü, ama hiçbir sebepten ötürü dahil edilmedi. Yine de, None geri ihtiyacı olan modeller için kullanışlı, 4 satırlık bir işlev.

İlgili konular