django:将查询集保存到会话

Han*_* Li 3 django django-cache django-queryset django-sessions

我试图将在一个视图中获得的查询结果保存到会话中,并在另一个视图中检索它,所以我尝试了以下操作:

def default (request):
    equipment_list = Equipment.objects.all()

    request.session['export_querset'] = equipment_list
Run Code Online (Sandbox Code Playgroud)

但是,这给了我

TypeError at /calbase/

<QuerySet [<Equipment: A>, <Equipment: B>, <Equipment: C>]> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

我想知道这到底是什么意思,我应该怎么做?也许除了使用会话之外,还有其他方法可以做我想要的事情?

e4c*_*4c5 5

如果这是您要保存的内容:

 equipment_list = Equipment.objects.all()
Run Code Online (Sandbox Code Playgroud)

您不应该或不需要使用会话。为什么?因为这是一个简单的查询,没有任何过滤。equipment_list对所有用户都是公用的。这可以很容易地保存在缓存中

 from django.core.cache import cache

 equipment_list = cache.get('equipment_list')
 if not equipment_list:
     equipment_list = Equipment.objects.all()
     cache.set('equipment_list',equipment_list)
Run Code Online (Sandbox Code Playgroud)

请注意,查询集可以保存在缓存中,而不必先将其转换为值。

更新:
另一个答案之一提到查询集不可json序列化。仅当您尝试将其作为json响应传递时才适用。在尝试缓存它时不适用,因为django.core.cache不使用json序列化,而是使用酸洗。