2015-05-04 153 views
4

我使用Django 1.7和Django Rest Framework。我已經寫了檢測用戶的登錄如下的API:索引錯誤:Django中的列表索引超出範圍

def login_check(request): 
    user = request.user 
    if user.is_anonymous(): 
     return HttpResponse(json.dumps({ 
      'success': False 
     })) 
    else: 
     try: 
      user_obj = UserProfile.objects.get(user__pk=user.id) 
     except UserProfile.DoesNotExist: 
      main_obj = User.objects.get(pk=user.id) 
      user_obj = UserProfile(user=main_obj) 
      user_obj.save() 
     fb_uid = SocialAccount.objects.filter(user_id=user.id, provider='facebook') 
     print fb_uid[0].uid 
     user_obj.profile_photo_url = "http://graph.facebook.com/{}/picture?width=300&height=300".format(fb_uid[0].uid) 
     user_obj.save() 
     serialized = UserProfileSerializer(user_obj) 
     return Response(serialized.data, status=status.HTTP_200_OK) 

我面對錯誤與此視圖,顯示以下回溯

IndexError at /loginCheck/ 
list index out of range 
Request Method: GET 
Request URL: http://localhost:8000/loginCheck/ 
Django Version: 1.7.4 
Exception Type: IndexError 
Exception Value:  
list index out of range 
Exception Location: f:\App\venv\lib\site-packages\django\db\models\query.py in __getitem__, line 178 
Python Executable: f:\App\venv\Scripts\python.exe 
Python Version: 2.7.6 
Python Path:  
['f:\\App', 
'f:\\App\\venv\\lib\\site-packages\\psycopg2-2.6-py2.7-win32.egg', 
'C:\\WINDOWS\\SYSTEM32\\python27.zip', 
'f:\\App\\venv\\DLLs', 
'f:\\App\\venv\\lib', 
'f:\\App\\venv\\lib\\plat-win', 
'f:\\App\\venv\\lib\\lib-tk', 
'f:\\App\\venv\\Scripts', 
'c:\\Python27\\Lib', 
'c:\\Python27\\DLLs', 
'c:\\Python27\\Lib\\lib-tk', 
'f:\\App\\venv', 
'f:\\App\\venv\\lib\\site-packages'] 

我不能完全肯定,如果這是我的代碼或Django的query.py中的錯誤。我很感激在這裏找出問題

+0

你可能得了與線路問題'打印fb_uid [0] .uid'當搜索返回空結果。 – Rohan

+0

你檢查了'SocialAccount.objects.filter'實際上是否返回一個不爲空的列表?您可以在該通話後直接嘗試「打印len(fb_uid)」。沒有結果時,您可能需要更多防禦性代碼才能處理。 –

回答

9

嘗試使用,而不是[0]索引查詢集的first()方法幫助:

so_account = SocialAccount.objects.filter(user_id=user.id, 
              provider='facebook').first() 
if so_account: 
    fb_uid = so_account.uid 
    ... 
+0

過濾函數的返回類型始終爲'django.db.models.query.QuerySet'。如果queryset中有兩條以上的記錄,是不是有可能得到'so_account [2]'這樣的記錄之一?那爲什麼如果記錄數是1,不可能使用'so_account [0]'。 –

+0

如果記錄數爲一個(或多個),則可以使用'so_account [0]'。但是如果記錄的數量是零,那麼會拋出'IndexError'。 – catavaran