繁体   English   中英

如何反序列化 Django 中的序列化查询集?

[英]How to deserialize a serialized queryset in Django?

视图.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 - 序列化、反序列化数据

在你的情况下,它会是这样的,

// 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"]),
    )
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM