我需要将模型数据(仅CharField
s)写入XML文件以包含flash文件的数据。我是新手,对于我在django这样做的过程有点不清楚。我正在创建一个xml文件,然后将文本数据写入文件(就像使用csv模块,但是使用xml)。一个非常简化的xml文件应该导致flash文件读取,即:
<?xml version="1.0" encoding="UTF-8"?>
<textFields>
<textField id="0" text="HELLO WORLD" />
<textField id="1" text="HELLO EARTH" />
...
</textFields>
1。我正在使用序列化程序从模型中编写xml数据:
from django.core import serializers
data = serializers.serialize('xml', myModel.objects.filter(instanceIwantTowrite), fields=('fieldName'))
2。然后我使用core.files
创建文件:
from django.core.files import File
f = open('/path/to/new/dir/content.xml', 'w')
myfile = File(f)
3。写入文件数据并关闭:
myfile.write(data)
myfile.close()
到目前为止,这是有效的,虽然xml输出包含对象“django-objects”等的字段,我将不得不看看我是否可以在ActionScript中轻松地为Flash文件解释这一点。我更喜欢手动定义xml字段名称,就像在csv模块中一样。由于我是django和python的新手,我想知道是否有更简单,更简单的方法来做到这一点?
注意:在序列化程序中,我对模型对象使用过滤器,因为对模型实例使用get
会返回object not iterable
错误。事实上,我过滤两次以获得单个实例,似乎必须有更好的方法。
答案 0 :(得分:26)
这里有两种可能的解决方案:
1。
您可以扩展基础django xml序列化程序(django.core.serializers.xml_serializer.Serializer
)并对其进行修改,以便它将返回结构中的数据。然后你可以运行ex。
YourSerializer('xml', myModel.objects.filter(instanceIwantTowrite), fields=('fieldName'))
它将在您的结构中输出数据。
2。
编写简单函数,该函数将使用您的数据结构呈现模板并以您的格式返回xml数据:
Python代码
from django.template.loader import render_to_string
def my_serialize(query_set):
xml = render_to_string('xml_template.xml', {'query_set': query_set})
return xml
模板xml_template.xml
<?xml version="1.0" encoding="UTF-8"?>
<textFields>
{% for object in query_set %}
<textField id="{{ object.pk }}" text="{{ object.my_field }}" />
{% endfor %}
</textFields>
答案 1 :(得分:1)
对于解决此问题的更通用的方法,您可以通过在模型上使用简单的duck punch来避免模板,并使用ElementTree将任何深层对象图序列化为XML。
以下是我如何解决它:
您的Model.py中的Monkey patch / duck punch模型如:
if hasattr(models.Model, "to_element")==False:
import xml.etree.ElementTree as ET
def to_element(self):
ele = ET.Element(self.__class__.__name__)
for field in self._meta.fields:
ele.attrib[field.attname]=str(getattr(self,field.attname))
return ele
models.Model.to_element = to_element
这为Model添加了一个方法,该方法创建一个Element实例,其中包含您关心的模型中的字段,而不包含django cruft。
然后,要构建您的xml文档,只需执行以下操作:
dealer = Dealer.objects.get(id=dealer_id)
makes = DealerMake.objects.filter(dealer=dealer)
root = dealer.to_element()
for make in makes:
root.append(make.to_element())
xml = ET.tostring(root)
print xml
使用这种方法,您可以获得格式良好的xml文档,其中所有django模型字段都作为属性,并构建一个n级深层次结构。每个xml节点的名称与模型类相同。