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

我正在使用 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 文件将正确包含与保修模型相关的所有对象。奇怪的是,在一种情况下的行为很好,在另一种情况下却没有,所以我不能再麻烦了。


慕田峪7331174
浏览 90回答 1
1回答

小唯快跑啊

问题是您试图在对象实际保存到数据库之前对其进行序列化 - 因此传递给序列化程序的查询集将不包含这个新项目。改变顺序: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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python