Django应用程序出现错误:”TypeError: ‘dict_keys’对象不可订阅”

huangapple go评论100阅读模式
英文:

Django app getting the error "TypeError: 'dict_keys' object is not subscriptable"

问题

以下是代码的翻译部分:

  1. 这是视图
  2. class UserViewSet(viewsets.ViewSet):
  3. def list(self, request):
  4. queryset = User.objects.all()
  5. serializer = UserSerializer(queryset, many=True)
  6. return Response(serializer.data)
  7. def retrieve(self, request, pk=None):
  8. queryset = User.objects.all()
  9. user = get_object_or_404(queryset, pk=pk)
  10. serializer = UserSerializer(user)
  11. return Response(serializer.data)

URLs:

  1. from django.urls import path
  2. from .views import *
  3. from rest_framework import routers
  4. userl = UserViewSet.as_view({'get': 'list'})
  5. userd = UserViewSet.as_view({'get': 'retrieve'})
  6. router = routers.SimpleRouter()
  7. router.register('users', UserViewSet, basename='user')
  8. urlpatterns = [
  9. path('users/', userl, name='user-list'),
  10. path('users/<int:pk>/', userd, name='user-detail'),
  11. path('register', RegisterUserAPIView.as_view()),
  12. path('login/', LoginAPIView.as_view()),
  13. path('logout', LogoutAPIView.as_view()),
  14. path('products', ProductsViewSet.as_view({'get': 'list'})),
  15. ]

跟踪信息:

  1. File "C:\Users\User\Desktop\erkin2\venv\lib\site-packages\routers\router.py", line 27, in db_for_read
  2. return settings.DATABASES.keys()[0]
  3. TypeError: 'dict_keys' object is not subscriptable
  4. 我尝试使用`keys()`,但然后它说:
  5. > 函数没有属性keys()。
英文:

Here is the views:

  1. class UserViewSet(viewsets.ViewSet):
  2. def list(self, request):
  3. queryset = User.objects.all()
  4. serializer = UserSerializer(queryset, many=True)
  5. return Response(serializer.data)
  6. def retrieve(self, request, pk=None):
  7. queryset = User.objects.all()
  8. user = get_object_or_404(queryset, pk=pk)
  9. serializer = UserSerializer(user)
  10. return Response(serializer.data)

urls:

  1. from django.urls import path
  2. from .views import *
  3. from rest_framework import routers
  4. userl = UserViewSet.as_view({&#39;get&#39;: &#39;list&#39;})
  5. userd = UserViewSet.as_view({&#39;get&#39;: &#39;retrieve&#39;})
  6. router = routers.SimpleRouter()
  7. router.register(r&#39;users&#39;, UserViewSet, basename=&#39;user&#39;)
  8. urlpatterns = [
  9. path(&#39;users/&#39;, userl, name=&#39;user-list&#39;),
  10. path(&#39;users/&lt;int:pk&gt;/&#39;, userd, name=&#39;user-detail&#39;),
  11. path(&#39;register&#39;,RegisterUserAPIView.as_view()),
  12. path(&#39;login/&#39;, LoginAPIView.as_view()),
  13. path(&#39;logout&#39;, LogoutAPIView.as_view()),
  14. path(&#39;products&#39;, ProductsViewSet.as_view({&#39;get&#39;: &#39;list&#39;})),
  15. ]&#39;login/&#39;, LoginAPIView.as_view()),
  16. path(&#39;logout&#39;, LogoutAPIView.as_view()),
  17. path(&#39;products&#39;, ProductsViewSet.as_view({&#39;get&#39;: &#39;list&#39;})),
  18. ]

Traceback:

  1. File &quot;C:\Users\User\Desktop\erkin2\venv\lib\site-packages\routers\router.py&quot;, line 27, in db_for_read
  2. return settings.DATABASES.keys()[0]
  3. TypeError: &#39;dict_keys&#39; object is not subscriptable

I've tried using keys() but then it says:

> function has no attribute keys().

答案1

得分: 1

  1. 明显并且也许逆直觉的是字典的 `keys()` 方法并不返回一个键列表让我们检查一下
  2. ```python
  3. d = {'a': 1, 'b': 2}
  4. print(d.keys())
  5. >>> dict_keys(['a', 'b'])
  6. print(type(d.keys()))
  7. >>> <class 'dict_keys'>
  8. d.keys()[0]
  9. >>> TypeError: 'dict_keys' 对象不可索引

这并不总是如此。在Python 2中,keys() 方法确实返回一个列表。参见这个旧问题

要获取键的实际列表,您可以在字典上调用 list()

  1. print(list(d))
  2. >>> ['a', 'b']

然后索引将按预期工作:

  1. print(list(d)[0])
  2. >>> a

因此,您可能希望将行 return settings.DATABASES.keys()[0] 更改为:

  1. return list(settings.DATABASES)[0]
  1. <details>
  2. <summary>英文:</summary>
  3. Apparently and perhaps counter-intuitively, the `keys()` method for dictionaries does not return a list of keys. Let&#39;s check:
  4. ```python
  5. d = {&#39;a&#39;: 1, &#39;b&#39;: 2}
  6. print(d.keys())
  7. &gt;&gt;&gt; dict_keys([&#39;a&#39;, &#39;b&#39;])
  8. print(type(d.keys()))
  9. &gt;&gt;&gt; &lt;class &#39;dict_keys&#39;&gt;
  10. d.keys()[0]
  11. &gt;&gt;&gt; TypeError: &#39;dict_keys&#39; object is not subscriptable

This was not always so. In Python 2, the keys() method did return a list. See this old question.

To get an actual list of the keys, you can call list() on the dictionary:

  1. print(list(d))
  2. &gt;&gt;&gt; [&#39;a&#39;, &#39;b&#39;]

Then indexing works as expected:

  1. print(list(d)[0])
  2. &gt;&gt;&gt; a

So you may want to change the line return settings.DATABASES.keys()[0] to this:

  1. return list(settings.DATABASES)[0]

huangapple
  • 本文由 发表于 2023年4月7日 04:14:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/75953425.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定