Django应用报错TypeError: 'dict_keys'不可下标访问求助
解决Django中TypeError: 'dict_keys' object is not subscriptable错误
错误详情
报错栈:
File "C:\Users\User\Desktop\erkin2\venv\lib\site-packages\routers\router.py", line 27, in db_for_read return settings.DATABASES.keys()[0] TypeError: 'dict_keys' object is not subscriptable
尝试调用keys()方法时,还收到提示:
function has no attribute keys().
问题原因
- 核心错误:Python3中,
dict.keys()返回的是dict_keys视图对象,它支持迭代但不支持下标访问,所以keys()[0]会触发TypeError。 - URL配置存在语法错误:代码中有重复的
path配置块,会导致解析失败。
解决方案
1. 修复数据库路由代码
找到虚拟环境中routers/router.py文件的db_for_read方法,将return settings.DATABASES.keys()[0]替换为以下任意一种写法:
方法一:转换为列表后取下标
return list(settings.DATABASES.keys())[0]
方法二:通过迭代器获取第一个元素
return next(iter(settings.DATABASES.keys()))
2. 修正URL配置中的语法错误
删除重复的代码块,正确的urlpatterns如下:
from django.urls import path from .views import * from rest_framework import routers userl = UserViewSet.as_view({'get': 'list'}) userd = UserViewSet.as_view({'get': 'retrieve'}) router = routers.SimpleRouter() router.register(r'users', UserViewSet, basename='user') urlpatterns = [ path('users/', userl, name='user-list'), path('users/<int:pk>/', userd, name='user-detail'), path('register',RegisterUserAPIView.as_view()), path('login/', LoginAPIView.as_view()), path('logout', LogoutAPIView.as_view()), path('products', ProductsViewSet.as_view({'get': 'list'})), ] # 若要使用router注册的路由,添加以下代码 # urlpatterns += router.urls
额外说明
若你遇到function has no attribute keys()提示,大概率是误将settings.DATABASES当成函数调用(比如写成settings.DATABASES()),检查代码确保是直接访问settings.DATABASES这个字典对象。
内容的提问来源于stack exchange,提问作者Prims3s
相关产品推荐
相关产品推荐

