Como preencher externo, um modelo Django?

votos
8

Qual é a melhor idéia para preencher os dados em um modelo de Django a partir de uma fonte externa?

Por exemplo, eu tenho um Run modelo, e os dados é executado em um arquivo XML, que muda semanalmente.

Devo criar uma visão e chamar essa visão URL a partir de um cronjob onda (com a vantagem de que os dados podem ser lidos em qualquer momento, não só quando o cron é executado), ou criar um script python e instalar esse script como um cron (com DJANGO _Settings configuração variável _Module antes de executar o script)?

Publicado 07/02/2009 em 18:54
fonte usuário
Em outras línguas...                            


4 respostas

votos
10

Há excelente maneira de fazer alguns trabalhos de manutenção, como em projeto ambiente- escrever uma comando manage.py costume . É preciso toda a configuração ambiente e outras coisas permite-lhe concentrar-se em tarefa concreta.

E, claro, chamá-lo diretamente pelo cron.

Respondeu 07/02/2009 em 19:43
fonte usuário

votos
4

Você não precisa criar um ponto de vista, você deve apenas acionar um script python com as apropriadas configurações de ambiente Django configurados . Em seguida, chamar seus modelos diretamente a maneira como você faria se você estivesse usando um ponto de vista, processar os seus dados, adicioná-lo ao seu modelo, então .Save () o modelo de banco de dados.

Respondeu 07/02/2009 em 19:03
fonte usuário

votos
2

Eu usei cron para atualizar meu DB usando tanto um roteiro e uma vista. Do ponto de vista do cron isso realmente não importa qual você escolher. Como você observou, porém, é difícil de bater a simplicidade de disparar um navegador e bater um URL se você quiser atualizar em um intervalo não-programada.

Se você vai a rota vista, pode valer a pena considerar uma visão que aceita o arquivo XML em si através de um HTTP POST. Se isso faz sentido para os seus dados (você não dá muita informação sobre esse arquivo XML), ele continuaria a trabalhar a partir do cron, mas também poderia aceitar um upload de um navegador - potencialmente deixando a pessoa que produz o arquivo XML atualizar o DB por si mesmos. Isso é uma grande vitória, se você não é o único a fazer o arquivo XML, que é geralmente o caso na minha experiência.

Respondeu 07/02/2009 em 20:33
fonte usuário

votos
2

"Criar um script python e instalar esse script como um cron (com configuração variável DJANGO _Settings _Module antes de executar o script)?"

Primeiro, certifique-se de declarar suas formas em um módulo separado (por exemplo forms.py)

Em seguida, você pode escrever carregadores de lote que se parecem com isso. (Temos um monte desses.)

from myapp.forms import MyObjectLoadForm
from myapp.models import MyObject
import xml.etree.ElementTree as ET

def xmlToDict( element ):
    return dict(
        field1= element.findtext('tag1'),
        field2= element.findtext('tag2'),
    )

def loadRow( aDict ):
     f= MyObjectLoadForm( aDict )
     if f.is_valid():
         f.save()

def parseAndLoad( someFile ):
    doc= ET.parse( someFile ).getroot()
    for tag in doc.getiterator( "someTag" )
        loadRow( xmlToDict(tag) )

Note-se que há muito pouco processamento única aqui - ele só usa a mesma forma e modelo como suas funções view.

Colocamos esses scripts em lotes em com a nossa aplicação Django, uma vez que depende da aplicação de models.pye forms.py.

A única parte "interessante" é transformar a sua linha de XML em um dicionário para que ele funciona perfeitamente com as formas do Django. Fora isso, este programa de linha de comando usa todos os mesmos componentes do Django como o seu ponto de vista.

Você provavelmente vai querer adicionar opções de análise e registro para fazer um aplicativo de linha de comando completa fora deste. Você também vai notar que grande parte da lógica é genérico - apenas o xmlToDictfunção é verdadeiramente único. Chamamos esses "Construtores" e tem uma hierarquia de classes para que os nossos construtores estão todos os mapeamentos polimórficas de nossos documentos de origem para dicionários Python.

Respondeu 07/02/2009 em 20:26
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more