Создание файла XML из данных модели

Мне нужно написать данные модели (только CharField s) в файл 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 ошибкой. На самом деле я отфильтровываю его дважды, чтобы получить один экземпляр, кажется, что должен быть лучший способ.

2 Solutions collect form web for “Создание файла XML из данных модели”

У вас есть два возможных решения:

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> 

Для более общего подхода к решению этой проблемы вы можете избежать шаблонов, используя простой утиный удар по Модели, и сериализуйте любой граф глубоких объектов в XML с помощью ElementTree.

Вот как я это решил:

Модели Monkey patch / duck punch в модели 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 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 будет называться таким же, как класс модели.

  • В чем разница beautifulsoup и bs4
  • Порядок элементов из minidom getElementsByTagName
  • Быстрый способ фильтрации незаконных символов xml unicode в python?
  • Переведите xml-строку в html, я получил сообщения об ошибках
  • Может ли Python xml ElementTree проанализировать очень большой XML-файл?
  • Эффективное получение XML в Elasticsearch
  • Как заставить BeautifulSoup 4 уважать самозакрывающийся тег?
  • Как я могу избежать двоеточий в имени атрибута с ElementTree Python?
  • Python - лучший язык программирования в мире.