Создание файла XML из данных модели
Мне нужно написать данные модели (только CharField
) в файл XML, чтобы содержать данные для флеш файла. Я новичок в этом, и этот процесс немного непонятен мне для этого в django. Я создаю xml файл, а затем записываю текстовые данные в файл (как это делается с модулем csv, но в xml). Для чтения файла флэш файла должен быть очень упрощенный XML файл, т.е.
<?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 для флеш файла. Я бы предпочел определить имена полей xml вручную, как в модуле csv. Поскольку я новичок в django и python, мне интересно, есть ли более простой и простой способ сделать это?
Примечание: В сериализаторе я использую фильтр для объектов модели, потому что использование get
для экземпляра модели возвращает ошибку object not iterable
. На самом деле я отфильтровываю его дважды, чтобы получить один экземпляр, кажется, что должен быть лучший способ.
Ответы
Ответ 1
У вас есть два возможных решения:
1.
Вы можете расширить базовый django xml serializer (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>
Ответ 2
Для более общего подхода к решению этой проблемы вы можете избежать шаблонов, используя простой утиный удар по Модели, и сериализуйте любой граф глубоких объектов в XML с помощью ElementTree.
Вот как я его решил:
Обезьяна патч/утка пунш модели в Model.py, как:
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.
Затем, чтобы создать свой 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 node будет называться таким же, как класс модели.