gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:42:44 26 4
gpt4 key购买 nike

我正在使用 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 文件将正确包含与保修模型相关的所有对象。在一种情况下的行为在另一种情况下很好,这似乎很奇怪,所以我无法进一步解决问题。

最佳答案

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

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)

关于python - 序列化程序不从查询集中写入单个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60200939/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com