Newtt
Newtt

Reputation: 6190

Index Error: list index out of range in Django

I'm using Django 1.7 with Django Rest Framework. I've written an API that detects the login of a user as follows:

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)

I face an error with this view which shows the following traceback

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']

I'm not entirely sure if this is an error in my code or Django's query.py. I'd appreciate help in figuring out the problem here

Upvotes: 14

Views: 34188

Answers (2)

Amadeu Cavalcante Filho
Amadeu Cavalcante Filho

Reputation: 2388

In the django documentation

Says that:

Entry.objects.order_by('headline')[0]
Entry.objects.order_by('headline')[0:1].get()

Note, however, that the first of these will raise IndexError while the second will raise DoesNotExist if no objects match the given criteria. See get() for more details.

So if that is possible that your query will return no data at all. You might want to use Entry.objects.order_by('headline')[0:1].get() instead of its shortcut [0]

Upvotes: -1

catavaran
catavaran

Reputation: 45565

Try to use the first() method instead of [0] indexing of queryset:

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

Upvotes: 25

Related Questions