首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >API给出了TypeError:不可理解的类型:'dict‘

API给出了TypeError:不可理解的类型:'dict‘
EN

Stack Overflow用户
提问于 2019-08-06 12:22:26
回答 3查看 1.4K关注 0票数 0

我正在开发一个django-,在该API中,我对VectorWise数据库进行一些SQL查询和计算,并使用get对一些输入参数创建响应。

一开始我有这样的结构来回应:

代码语言:javascript
复制
    response = {'Date': input_date,
                'Date comparable': date_comparable,
                'CA': {
                    'CA TTC (€)': ca_ttc_n,
                    'Rang magasin': rank,
                    'progression (%)': progression_percentage
                },
                'Nb art / pass caisse': {
                    'nombre': nb_art_pass_caiss,
                    'progression (%)': nb_art_pass_caiss_prog
                },
                'Panier': {
                    '(€)': panier,
                    'progression (%)': prog_panier}
                }

哪个工人很好,给了我一个回复。

然后,我试图改进响应的代码结构和可读性,如下所示:

代码语言:javascript
复制
    response = {'Date': input_date,
                'Comparable date': date_comparable,
                'Indicators': {
                    {"Name": "sales",
                     "Value": ca_ttc_n,
                     "Unit": currency,
                     "Rank": rank},
                    {"Name": "sales_progression",
                     "Value": progression_percentage,
                     "Unit": percentage,
                     "Rank": rank},
                    {"Name": "customer_items_number",
                     "Value": nb_art_pass_caiss,
                     "Unit": "Units",
                     "Rank": rank},
                    {"Name": "customer_items_number_progression",
                     "Value": nb_art_pass_caiss_prog,
                     "Unit": percentage,
                     "Rank": rank},
                    {"Name": "basket",
                     "Value": panier,
                     "Unit": currency,
                     "Rank": rank}
                }

另一方面,这会导致抛出TypeError的错误

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\rest_framework\views.py", line 495, in dispatch
    response = self.handle_exception(exc)
  File "C:\ProgramData\Anaconda3\lib\site-packages\rest_framework\views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:\ProgramData\Anaconda3\lib\site-packages\rest_framework\views.py", line 466, in raise_uncaught_exception
    raise exc
  File "C:\ProgramData\Anaconda3\lib\site-packages\rest_framework\views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\rest_framework_extensions\cache\decorators.py", line 49, in inner
    kwargs=kwargs,
  File "C:\ProgramData\Anaconda3\lib\site-packages\rest_framework_extensions\cache\decorators.py", line 68, in process_cache_response
    response = view_method(view_instance, request, *args, **kwargs)
  File "C:\Users\10124077\Projects\dataplatform--web--api\wdc\views.py", line 484, in get
    "Rank": rank}
TypeError: unhashable type: 'dict'

为了更好地理解这个问题,我尝试删除了这个级别字段,并做了一些改进,但是我没有做到,因为它一直在响应体的其他字段上提高TypeError!有什么帮助吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-06 12:27:35

问题是:

代码语言:javascript
复制
'Indicators': {
                {"Name": "sales",
                 "Value": ca_ttc_n,
                 "Unit": currency,
                 "Rank": rank},
                {"Name": "sales_progression",
                 "Value": progression_percentage,
                 "Unit": percentage,
                 "Rank": rank},
                {"Name": "customer_items_number",
                 "Value": nb_art_pass_caiss,
                 "Unit": "Units",
                 "Rank": rank},
                {"Name": "customer_items_number_progression",
                 "Value": nb_art_pass_caiss_prog,
                 "Unit": percentage,
                 "Rank": rank},
                {"Name": "basket",
                 "Value": panier,
                 "Unit": currency,
                 "Rank": rank}
            }

...attempts来创建一组字典。所以,您的代码基本上是这样做的:

代码语言:javascript
复制
{{"this": "is", "a": "dictionary"}, {"within": "a set"}}

这是不可能的,因为一个人只能构造一组可持续的对象,而dict是不可用的。你可以读到“哈斯可”是什么意思在医生里。不过,您可以使用一个字典列表:

代码语言:javascript
复制
"Indicators": [
    {'Name': ..., 'Value': ...},
    {'Name': ..., 'Value': ...},
    ...
]
票数 5
EN

Stack Overflow用户

发布于 2019-08-06 12:29:09

你错过了一份清单:

代码语言:javascript
复制
            'Indicators': [
                {"Name": "sales",
                 "Value": ca_ttc_n,
                 "Unit": currency,
                 "Rank": rank},
                  ...
              ]
            }
票数 1
EN

Stack Overflow用户

发布于 2019-08-06 12:29:57

它的原因是,您试图设置一个字典指示器(具有诸如字典这样的不可访问的值),而没有任何键值。

代码语言:javascript
复制
response = {'Date': input_date,
                'Comparable date': date_comparable,
                'Indicators': {
                    'key1':{"Name": "sales",
                     "Value": ca_ttc_n,
                     "Unit": currency,
                     "Rank": rank},
                    'key2':{"Name": "sales_progression",
                     "Value": progression_percentage,
                     "Unit": percentage,
                     "Rank": rank},
                    'key3':{"Name": "customer_items_number",
                     "Value": nb_art_pass_caiss,
                     "Unit": "Units",
                     "Rank": rank},
                    'key4':{"Name": "customer_items_number_progression",
                     "Value": nb_art_pass_caiss_prog,
                     "Unit": percentage,
                     "Rank": rank},
                    'key5':{"Name": "basket",
                     "Value": panier,
                     "Unit": currency,
                     "Rank": rank}
                }
}

否则,如果不需要密钥,请将指示器作为列表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57375966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档