序列化器未从查询集中写入单个对象

问题描述 投票:0回答:1

我正在使用ModelForm捕获模型的一些数据,虽然我希望将这些数据保存到db中,但我也想将其导出到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文件将正确包含与保修模型相关的所有对象。在一种情况下,该行为在另一种情况下没有问题,这似乎很奇怪,因此我再也无法进行任何射击了。

python django xml serializer
1个回答
0
投票

问题是,您正在尝试序列化对象,然后将它们实际保存到数据库中-因此传递给序列化程序的queryset将不包含此新项。更改顺序:

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)
© www.soinside.com 2019 - 2024. All rights reserved.