【问题标题】:Type Error: is not JSON serializable类型错误:不是 JSON 可序列化的
【发布时间】:2017-04-22 12:18:16
【问题描述】:

我正在尝试将数据库对象从一个视图传递到另一个视图。但是当我尝试使用 SESSION 来实现这一点时,我得到了这个“不是 JSON 可序列化”错误。

我的Views.py

def index(request):
    listset = TheaterBase.objects.all()
    request.session['s_listset'] = listset

def otherview(request):
    result = request.session.get('s_listset')

如何在视图之间传递 Database 对象?

提前致谢

【问题讨论】:

  • 为什么要这样做?为什么不能在其他视图中进行查询?
  • 我需要对所有视图使用相同的查询,所以我需要将它们存储在会话中,以减少服务器的负载。 @丹尼尔罗斯曼
  • 这似乎不是一个很好的理由。如果你这样做,它永远不会在添加新项目时更新;并且查询集将为每个用户单独存储。如果您需要共享查询,请使用每个视图调用的通用函数或上下文处理器。

标签: python json django session


【解决方案1】:

服务器会话只能存储 JSON 对象。您正在尝试存储一个复杂的 Django QuerySet 对象,它自然不是 JSON 可序列化的。

相信我,即使是这样,你也不会想要这样做。使用大量数据滥用服务器会话是不健康的。

【讨论】:

    【解决方案2】:

    假设您的 TheaterBase 类如下所示(伪代码)

    class TheaterBase:
      field1 ...
      fielld2 ...
     -------
     # a method to produce json serializable representation 
     def as_dict(self):
       return {'field1': self.field1, 'fileld2': self.fielld2}
    

    然后你看做

    listset = [x.as_dict() for x in TheaterBase.objects.all()]
    

    这里的问题是从您的数据库查询出来的对象不是 json 可序列化的。上面的 as_dict 方法正在构造该对象的 json 可序列化表示。

    【讨论】:

      【解决方案3】:

      您可以尝试使用 django 序列化程序

      from django.core import serializers
      listset = serializers.serialize("json", TheaterBase.objects.all())
      

      【讨论】:

      • 谢谢listset = serializers.serialize("json", TheaterBase.objects.all().values_list('field')) is not working
      猜你喜欢
      • 2022-12-21
      • 2019-04-29
      • 2016-01-25
      • 2015-07-10
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 2021-12-24
      • 2021-06-07
      相关资源
      最近更新 更多