场景:我在学习中级 Django 应用:TweerApprover 的过程中,完成了 poster 的 urls.py、views.py 以及 post_tweet.html 和 than_you.html 两个页面后,开始操作起来,插入一条待审核的 tweet, 结果报错:
Traceback (most recent call last):
......省略多行
File "/Users/mac/Documents/Django/myproject/poster/views.py", line 23, in post_tweet
state='pending').aggregate(Count('id')).values()[0]
TypeError: 'dict_values' object does not support indexing
其实数据成功插入了,后面根据 state=pending
筛选数据后,对结果的处理出了问题。
贴出源码:
def thankyou(request):
tweets_in_queue = Tweet.objects.filter(
state='pending').aggregate(Count('id')).values()[0]
return TemplateView.as_view(template_name ='thank_you.html',
extra_context = {'tweets_in_queue': tweets_in_queue})(request)
查了一下发现 stackvoerflow 是个好论坛,查询结果如下原链接
In python3.x, dict.values() doesn't return a list anymore -- it returns a dict_values object.
很明显,最后的返回结果不能当数组处理,得当字典处理才行。可我不清楚里面的 key 和 value呀!
怎么办?接下来你会发现 Django shell 真香。
cd 到项目目录下,然后 python3 manage.py shell
进入
wd:myproject noduez$ python3 manage.py shell
Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from poster.models import Tweet
>>> from django.db.models import Count
>>> ti = Tweet.objects.filter(
... state='pending').aggregate(Count('id'))
>>> ti
{'id__count': 0}
>>> ti['id__count']
0
这下不就清清楚楚,明明白白了么!
接下来改代码:不再用 .vlaues()[0]
直接改成['id__count']
,即取key=id__count
的value
def thankyou(request):
tweets_in_queue = Tweet.objects.filter(
state='pending').aggregate(Count('id'))['id__count']
return TemplateView.as_view(template_name ='thank_you.html',
extra_context = {'tweets_in_queue': tweets_in_queue})(request)
插入第一条数据:
插入第二条数据:
网友评论