API 给出 ​​TypeError: unhashable type: 'dict'

S.J*_*son 1 python typeerror

我正在开发一个 django-rest-framework API,在其中对 VectorWise 数据库进行一些 SQL 查询和计算,并通过获取一些输入参数来创建响应。

\n\n

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

\n\n
    response = {\'Date\': input_date,\n                \'Date comparable\': date_comparable,\n                \'CA\': {\n                    \'CA TTC (\xe2\x82\xac)\': ca_ttc_n,\n                    \'Rang magasin\': rank,\n                    \'progression (%)\': progression_percentage\n                },\n                \'Nb art / pass caisse\': {\n                    \'nombre\': nb_art_pass_caiss,\n                    \'progression (%)\': nb_art_pass_caiss_prog\n                },\n                \'Panier\': {\n                    \'(\xe2\x82\xac)\': panier,\n                    \'progression (%)\': prog_panier}\n                }\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
    response = {\'Date\': input_date,\n                \'Comparable date\': date_comparable,\n                \'Indicators\': {\n                    {"Name": "sales",\n                     "Value": ca_ttc_n,\n                     "Unit": currency,\n                     "Rank": rank},\n                    {"Name": "sales_progression",\n                     "Value": progression_percentage,\n                     "Unit": percentage,\n                     "Rank": rank},\n                    {"Name": "customer_items_number",\n                     "Value": nb_art_pass_caiss,\n                     "Unit": "Units",\n                     "Rank": rank},\n                    {"Name": "customer_items_number_progression",\n                     "Value": nb_art_pass_caiss_prog,\n                     "Unit": percentage,\n                     "Rank": rank},\n                    {"Name": "basket",\n                     "Value": panier,\n                     "Unit": currency,\n                     "Rank": rank}\n                }\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一方面,这会不断抛出 TypeError 错误

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

我尝试删除排名字段并进行一些操作以更好地理解该问题,但我没有设法做到这一点,因为它不断在响应正文的其他字段上引发 TypeError !有什么帮助吗?

\n

For*_*Bru 6

问题是这样的:

'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}
            }
Run Code Online (Sandbox Code Playgroud)

...尝试创建一字典。所以,你的代码基本上是这样做的:

{{"this": "is", "a": "dictionary"}, {"within": "a set"}}
Run Code Online (Sandbox Code Playgroud)

这是无法完成的,因为只能构造一组可散列对象,而dicts 不可散列。您可以在文档中了解“可哈希”的含义。不过,您可以使用字典列表:

"Indicators": [
    {'Name': ..., 'Value': ...},
    {'Name': ..., 'Value': ...},
    ...
]
Run Code Online (Sandbox Code Playgroud)