python - Django:TypeError:ModelBase 类型的对象不是 JSON 可序列化的
问题描述
我收到错误“TypeError:ModelBase 类型的对象不是 JSON 可序列化的”。
但我不使用 JSON。而且我没有将任何“ModelBase”对象放入模板。
当我开始使用request.session
全局变量存储时,它就开始了。当我在纯 Python 中使用全局变量时 - 这个项目工作正常。(在本地开发人员服务器上,但在部署多用户负载时出现问题。)
我不明白问题出在哪里:我使用调试模式 - 我的 views.py 函数正确运行,它返回exit_
模板:
def page_Category_Main(request, cat_):
#...
exit_ = {
'category_name': category['category_name'], #str
'categories_list': categories_list, #list
'action': cat_, #str
'tbl_ttx_col': [x for x in tab_marketability.keys() if x not in ['id', 'brand', 'name', 'price_avg',
'appear_month']], #list
'tbl_data': tab_marketability, #dict
'tbl_data_nov': tab_novelty, #dict
'new_form': new_form, #dict
'enabled': enabled_return, #list
'checked_items': post_return, #list
'period': request.session['period_mth_rus'], #list
'tab_active': tab_active, #str
'tab_list': list(dict_tabs.keys()), #list
'tab_data': dict_tabs #dict
}
return render(request, template_name="al_category.html", context=exit_)
并且服务器开始处理模板al_category.html
(我在 Python 调试器中看到它,因为模板使用了一些@register.filter
函数views.py
)。
并在未知点引发此 TypeError:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/Nb/
Django Version: 3.1.2
Python Version: 3.7.3
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'marketability',
'bootstrap4']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "C:\Users\User\ITResearch\all_gid_2\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\User\ITResearch\all_gid_2\venv\lib\site-packages\django\utils\deprecation.py", line 116, in __call__
response = self.process_response(request, response)
File "C:\Users\User\ITResearch\all_gid_2\venv\lib\site-packages\django\contrib\sessions\middleware.py", line 63, in process_response
request.session.save()
File "C:\Users\User\ITResearch\all_gid_2\venv\lib\site-packages\django\contrib\sessions\backends\db.py", line 81, in save
return self.create()
File "C:\Users\User\ITResearch\all_gid_2\venv\lib\site-packages\django\contrib\sessions\backends\db.py", line 55, in create
self.save(must_create=True)
File "C:\Users\User\ITResearch\all_gid_2\venv\lib\site-packages\django\contrib\sessions\backends\db.py", line 83, in save
obj = self.create_model_instance(data)
File "C:\Users\User\ITResearch\all_gid_2\venv\lib\site-packages\django\contrib\sessions\backends\db.py", line 70, in create_model_instance
session_data=self.encode(data),
File "C:\Users\User\ITResearch\all_gid_2\venv\lib\site-packages\django\contrib\sessions\backends\base.py", line 116, in encode
compress=True,
File "C:\Users\User\ITResearch\all_gid_2\venv\lib\site-packages\django\core\signing.py", line 110, in dumps
data = serializer().dumps(obj)
File "C:\Users\User\ITResearch\all_gid_2\venv\lib\site-packages\django\core\signing.py", line 87, in dumps
return json.dumps(obj, separators=(',', ':')).encode('latin-1')
File "C:\Users\User\Anaconda3\lib\json\__init__.py", line 238, in dumps
**kw).encode(obj)
File "C:\Users\User\Anaconda3\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Users\User\Anaconda3\lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "C:\Users\User\Anaconda3\lib\json\encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
Exception Type: TypeError at /Nb/
Exception Value: Object of type ModelBase is not JSON serializable
什么是物质?!什么是“ModelBase 对象”?我没有在模板中使用它。我没有在我的代码中实现任何对象的序列化...我不使用 JSON 格式...
解决方案
默认情况下,Django 会话使用 JSON 序列化 - 请参阅会话序列化
您可以尝试使用PickleSerializer
,在您的settings.py中设置它- 请参阅SESSION_SERIALIZER:
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
或者编写自己的序列化程序:
请注意,与PickleSerializer不同,JSONSerializer不能处理任意 Python 数据类型。通常情况下,需要在便利性和安全性之间进行权衡。如果您希望在 JSON 支持的会话中存储更高级的数据类型,包括datetime和Decimal,则需要编写自定义序列化程序(或将这些值转换为 JSON 可序列化对象,然后再将它们存储在 request.session中)。虽然序列化这些值通常很简单(DjangoJSONEncoder可能会有所帮助),编写一个可以可靠地取回您放入的相同内容的解码器更加脆弱。例如,您可能会返回一个实际上是一个字符串的日期时间,而该字符串恰好与为datetimes选择的格式相同)。
您的序列化程序类必须实现两个方法,dumps(self, obj)和 loading(self, data),分别序列化和反序列化会话数据字典。
推荐阅读
- c# - MySQL 数据库本身中不存在的 EntityFrameworkModel 中的方案
- python - 根据行/列的值提取字符串
- php - 如何处理 cookie 的路径属性中的空格
- android - 如何检测应用程序是关闭还是暂停
- r - 执行此操作的 R 命令是什么?
- python - Python Pandas:意味着新列中每 n 行重复 n 次
- javascript - 无法读取 null nodejs google 电子表格的属性提要
- python - 仅使用 NumPy 的 Python 图像卷积
- r - 从列表中提取数据并将其放入一个整洁的小标题中,R
- apache-zookeeper - 检查zookeeper运行模式的正确方法