Анализа и представления данных в Django


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

Я получаю XML-ответа от API, который дает мне несколько документов.

Сначала я определяю макет класса, как это:

class MockDocument:
    pass

Потом написать выражение XPath, которое дает мне список узлов документа:

from lxml import etree   
with open("xmlapiresponse.xml", "r") as doc:
    xml_response = doc.read()   
tree = etree.fromstring(xml_response)                                                        
document_nodes = tree.xpath("//documents/item") 

Теперь я перебора различных документов и их полей с использованием вложенных дляпетель:

# list for storing the objects
document_objects = []
for document in document_nodes:
    # create a MockDocument for each item returned by the API
    document_object = MockDocument()    
    for field in document:
        # store the corresponding fields as object attributes
        if field.tag == "something":
            document.something = field.text
    document_objects.append(document)         

Теперь я могу передать список mock объектов в представление Django и представлять их в шаблоне в зависимости от того, как я хочу. Это могло быть сделано в более простой способ, правда?



5236
2
задан 22 июля 2011 в 10:07 Источник Поделиться
Комментарии
1 ответ

Используя функцию генератора дает вам некоторую гибкость. Вам не придется создавать список.

def generate_documents( document_nodes ):

for document in document_nodes:
# create a MockDocument for each item returned by the API
document_object = MockDocument()
for field in document:
# store the corresponding fields as object attributes
if field.tag == "something":
document.something = field.text
yield document_object

Вы можете сделать это в список объектов-то важное.

document_objects = list( generate_documents( document_nodes ) )

Или, с большей пользой, это

for d in generate_documents( document_nodes ):
... process the document ...

Которые никогда на самом деле создает объект списка.

4
ответ дан 22 июля 2011 в 03:07 Источник Поделиться