首页 > 解决方案 > 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 格式...

标签: pythondjango

解决方案


默认情况下,Django 会话使用 JSON 序列化 - 请参阅会话序列化

您可以尝试使用PickleSerializer,在您的settings.py中设置它- 请参阅SESSION_SERIALIZER

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'

或者编写自己的序列化程序

请注意,与PickleSerializer不同,JSONSerializer不能处理任意 Python 数据类型。通常情况下,需要在便利性和安全性之间进行权衡。如果您希望在 JSON 支持的会话中存储更高级的数据类型,包括datetimeDecimal,则需要编写自定义序列化程序(或将这些值转换为 JSON 可序列化对象,然后再将它们存储在 request.session中)。虽然序列化这些值通常很简单(DjangoJSONEncoder可能会有所帮助),编写一个可以可靠地取回您放入的相同内容的解码器更加脆弱。例如,您可能会返回一个实际上是一个字符串的日期时间,而该字符串恰好与为datetimes选择的格式相同)。

您的序列化程序类必须实现两个方法,dumps(self, obj)loading(self, data),分别序列化和反序列化会话数据字典。


推荐阅读