2016-12-07 54 views
0

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

Views.py

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

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

如何通过数据库对象之间的意见?

在此先感谢

+0

你为什么要?为什么你不能在另一个视图中查询? –

+0

我需要在所有视图上使用相同的查询, 所以我需要将它们存储在会话中,以便减少服务器的负载。 @DanielRoseman –

+0

这似乎不是一个很好的理由。如果你这样做,它将永远不会更新添加新项目;并且查询集将为每个单独的用户单独存储。如果您需要共享查询,请使用每个视图调用的通用函数或上下文处理器。 –

回答

0

我们只是假设您TheaterBase类是类似下面的东西对你查看做

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

这里的问题是(伪代码)

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

然后来自你的数据库查询的对象不是json可串行化的。上面的as_dict方法构造了该对象的一个​​json可序列化表示。

1

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

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

0

您可以尝试使用Django串行

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

谢谢但'listset = serializers.serialize(“json”,TheaterBase.objects.all()。values_list('field'))不起作用 ' –