Как десериализовать сериализованный набор запросов в Django?

views.py

def ipd_report_view(request):
    report=IpdReport.objects.all()
    myFilter=IpdFilters(request.POST, queryset=report)
    report=myFilter.qs
    total1=report.aggregate(Sum('realization__amount_received'))
    total2=report.aggregate(Sum('realization__deficit_or_surplus_amount'))
    rp=serializers.serialize('json', report)
    request.session['report']=rp
    context={'report': report, 'total1':total1, 'total2':total2, 'myFilter':myFilter}
    return render(request, 'account/ipdreport.html', context)

В другой функции view мне нужно использовать данные в session, чтобы функция могла экспортировать данные в файл excel.

Я сделал rp=request.session['report'], но этот object является объектом string, поэтому как мне преобразовать его обратно в queryset? Или есть какой-нибудь другой способ добиться этого?

Вам просто нужно использовать обратный метод, deserialize,

Django Docs - Serialization, deserializing-data

В вашем случае это было бы что-то вроде этого,

// serializers.deserialize returns an iterator,
// but we know is just one element
obj = list(serializers.deserialize("json", request.session['report']))[0]
// obj is a DeserializedObject not the instance of the model
// to inspect the element just use the object property
rp = IpdReport.objects.get(pk=obj.object.pk)

В вопросе конкретно спрашивается о получении QuerySet обратно, поэтому стоит отметить, что вызов serializers.deserialize (согласно ответу @cabesuon) этого не сделает - он вернет генератор, выдающий DeserializedObject. Если это недостаточно хорошо для вашего случая, вы можете захотеть восстановить QuerySet:

IpdReport.objects.filter(
    pk__in=map(
        lambda o: o.object.pk,
        serializers.deserialize("json", request.session["report"]),
    )
)
Вернуться на верх