为了账号安全,请及时绑定邮箱和手机立即绑定

序列化程序不从查询集中写入单个对象

序列化程序不从查询集中写入单个对象

慕田峪7331174 2022-07-26 15:50:47
我正在使用 ModelForm 为模型捕获一些数据,虽然我希望将这些数据保存到数据库中,但我还想将其导出到 XML 文件以在外部系统中进行转换/使用。请参阅下面的示例:def warranty(request):    WarrantyFormSet = modelformset_factory(Warranty, form=WarrantyForm)    if request.method == 'POST':        formset = WarrantyFormSet(request.POST, request.FILES)        if formset.is_valid():            new = formset.save(commit=False)            out = open("file.xml", "w")            XMLSerializer = serializers.get_serializer("xml")            xml_serializer = XMLSerializer()            for n in new:                xml_serializer.serialize(Warranty.objects.all(), stream=out)                #.filter(id = n.id)                n.save()            return HttpResponse(xml_serializer.serialize(Warranty.objects.filter(id = n.id)))    else:        formset = WarrantyFormSet(queryset = Warranty.objects.none())    return render(request,'warranty.html', {'formset': formset})该对象在 HttpResponse 中进行了适当的序列化(即我可以看到可接受的 XML 输出),但 XML 文件本身没有输出。如果我删除 QuerySet 过滤器(即调用 .all()),那么 XML 文件将正确包含与保修模型相关的所有对象。奇怪的是,在一种情况下的行为很好,在另一种情况下却没有,所以我不能再麻烦了。
查看完整描述

1 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

问题是您试图在对象实际保存到数据库之前对其进行序列化 - 因此传递给序列化程序的查询集将不包含这个新项目。改变顺序:


for n in new:

    n.save()

    xml_serializer.serialize(Warranty.objects.filter(id=n.id), stream=out)

另请注意,您当前的逻辑将新的序列化写入您的 for 循环内的文件 - 我不确定这是您想要的。您可以像这样一次序列化所有内容:


if request.method == 'POST':

    formset = WarrantyFormSet(request.POST, request.FILES)

    if formset.is_valid():

        new_items = formset.save()  # commit = True since you don't need to change anything before saving

        new_item_ids = [n.id for n in new_items]

        with open("file.xml", "w") as out:

            XMLSerializer = serializers.get_serializer("xml")

            xml_serializer = XMLSerializer()

            xml_serializer.serialize(

                Warranty.objects.filter(id__in=new_item_ids), stream=out)


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号