Создать файл XML из данных модели - PullRequest
12 голосов
/ 30 сентября 2010

Мне нужно записать данные модели (только 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 ]

26 голосов
/ 30 сентября 2010

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

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 голос
/ 14 марта 2012

Для более общего подхода к решению этой проблемы вы можете избежать шаблонов, используя простой метод утки в моделях, и сериализовать любой граф глубоких объектов в 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, содержащий поля из модели, которая вас интересует, безthe 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 будет назван так же, как класс модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...