I'm using Django 1.7 with Django Rest Framework. I've written an API that detects the login of a user as follows:
我正在使用Django 1.7和Django Rest Framework。我编写了一个用于检测用户登录的API,如下所示:
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
我不完全确定这是我的代码或Django的query.py中的错误。我很感激帮助解决这个问题
2 个解决方案
#1
Try to use the first()
method instead of [0]
indexing of queryset:
尝试使用first()方法而不是[0]索引查询集:
so_account = SocialAccount.objects.filter(user_id=user.id,
provider='facebook').first()
if so_account:
fb_uid = so_account.uid
...
#2
In the django documentation
在django文档中
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.
但请注意,如果没有对象符合给定条件,则第一个将引发IndexError,而第二个将引发DoesNotExist。有关详细信息,请参阅get()。
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]
因此,如果可能您的查询将根本不返回任何数据。你可能想使用Entry.objects.order_by('headline')[0:1] .get()而不是它的快捷方式[0]
#1
Try to use the first()
method instead of [0]
indexing of queryset:
尝试使用first()方法而不是[0]索引查询集:
so_account = SocialAccount.objects.filter(user_id=user.id,
provider='facebook').first()
if so_account:
fb_uid = so_account.uid
...
#2
In the django documentation
在django文档中
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.
但请注意,如果没有对象符合给定条件,则第一个将引发IndexError,而第二个将引发DoesNotExist。有关详细信息,请参阅get()。
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]
因此,如果可能您的查询将根本不返回任何数据。你可能想使用Entry.objects.order_by('headline')[0:1] .get()而不是它的快捷方式[0]