如何使可序列化的JSON类可在Django会话中使用

时间:2019-01-12 01:49:48

标签: python json django session serialization

我尝试在Django会话中存储以下几乎任意的类:

 type Data struct {
      DataFields []string
 }

依次,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

如何使数据结构可JSON序列化?

我看到了其他问题,但是,那里的答案大多建议实现一个方法作为参数传递。但是在Django中该怎么做?

2 个答案:

答案 0 :(得分:0)

使用__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)

希望这会有所帮助!

答案 1 :(得分:0)

Here 是可能的解决方案。

当涉及到对数据进行序列化/反序列化时,Django的序列化器非常方便。

您也可以关注this。 还请检查deserialization