我尝试在 Django session 中存储以下任意类:
class QuizInfo:
def __init__(self):
self.i_active_question = INVALID_PQA_ID # integer
self.sequence = []
反过来,QuizInfo.sequence
列表中的每一项都是 AnsweredQuestion
的实例:
class AnsweredQuestion:
def __init__(self, i_question, i_answer):
self.i_question = i_question
self.i_answer = i_answer
我尝试将这样的数据结构存储在 HttpRequest.session
中,如下所示:
qi = QuizInfo()
qi.i_active_question = 5 # e.g.
qi.sequence.append(AnsweredQuestion(1, 2)) # e.g.
qi.sequence.append(AnsweredQuestion(3, 4)) # e.g.
quiz_id = 7 # e.g.
request.session['quiz_infos'] = {quiz_id : qi}
因此 request.session['quiz_infos']
是一个包含 int
键和 QuizInfo
值的字典。
我收到以下错误:
Traceback:
File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\core\handlers\exception.py" in inner
34. response = get_response(request)
File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\utils\deprecation.py" in __call__
93. response = self.process_response(request, response)
File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\contrib\sessions\middleware.py" in process_response
58. request.session.save()
File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\contrib\sessions\backends\db.py" in save
83. obj = self.create_model_instance(data)
File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\contrib\sessions\backends\db.py" in create_model_instance
70. session_data=self.encode(data),
File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\contrib\sessions\backends\base.py" in encode
96. serialized = self.serializer().dumps(session_dict)
File "C:\Users\Sarge\Envs\PqaWeb1\lib\site-packages\django\core\signing.py" in dumps
87. return json.dumps(obj, separators=(',', ':')).encode('latin-1')
File "c:\programs\python37\Lib\json\__init__.py" in dumps
238. **kw).encode(obj)
File "c:\programs\python37\Lib\json\encoder.py" in encode
199. chunks = self.iterencode(o, _one_shot=True)
File "c:\programs\python37\Lib\json\encoder.py" in iterencode
257. return _iterencode(o, 0)
File "c:\programs\python37\Lib\json\encoder.py" in default
179. raise TypeError(f'Object of type {o.__class__.__name__} '
Exception Type: TypeError at /
Exception Value: Object of type QuizInfo is not JSON serializable
如何使数据结构JSON可序列化?
我看到了其他问题,但是,那里的答案大多建议实现一种作为参数传递的方法。但是在 Django 中哪里可以做到这一点呢?
最佳答案
使用__dict__
将其更改为字典。在您的情况下,尽管您有嵌套对象,但也需要将其转换为字典。这可以在jsbueno答案here中找到。基本上你必须迭代你的对象来检查嵌套对象,像这样,
def my_dict(obj):
if not hasattr(obj,"__dict__"):
return obj
result = {}
for key, val in obj.__dict__.items():
if key.startswith("_"):
continue
element = []
if isinstance(val, list):
for item in val:
element.append(my_dict(item))
else:
element = my_dict(val)
result[key] = element
return result
编辑:
然后你可以将结果转储到字符串中,如下所示,
import json
json.dumps(result)
希望这有帮助!
关于python - 如何使类 JSON 可序列化以在 Django session 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54156120/