2009-02-07 12 views
8

Qual è l'idea migliore per riempire i dati in un modello Django da una fonte esterna?Come popolare esternamente un modello Django?

E.g. Ho un modello Esegui e gira i dati in un file XML, che cambia settimanalmente.

Devo creare una vista e chiamare quell'URL di visualizzazione da un cronjob dell'arricciatura (con il vantaggio che i dati possono essere letti in qualsiasi momento, non solo quando viene eseguito il cronjob), oppure creare uno script python e installare quello script come cron (con DJANGO _SETTINGS _MODULE impostazione delle variabili prima di eseguire lo script)?

risposta

10

Esiste un modo eccellente per eseguire lavori di manutenzione nell'ambiente di progetto: scrivere un numero custom manage.py command. Ci vuole tutta la configurazione dell'ambiente e altre cose che ti permettono di concentrarti su un compito concreto.

E ovviamente chiamarlo direttamente da cron.

4

Non è necessario creare una vista, è sufficiente attivare uno script python con l'appropriato Django environment settings configured. Quindi chiama i tuoi modelli direttamente come faresti se usassi una vista, elaborassi i tuoi dati, li aggiungessi al tuo modello, poi .save() il modello nel database.

+0

Posso farlo da entrambi i lati, salvarlo dalla vista o salvarlo dallo script python. – Marius

+0

Un comando di gestione personalizzato è una soluzione migliore rispetto al munging delle impostazioni dell'ambiente Django. Vedi la risposta di Daevaorn. –

2

"creare uno script python e installare quello script come cron (con DJANGO _SETTINGS _MODULE setup delle variabili prima di eseguire lo script)?"

In primo luogo, essere sicuri di dichiarare le forme in un modulo separato (ad esempio forms.py)

Quindi, è possibile scrivere caricatori batch che assomigliano a questo. (Abbiamo un sacco di questi.)

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)) 

Si noti che c'è ben poco di elaborazione unica qui - è solo utilizza la stessa forma e modello come le funzioni di visualizzazione.

Inseriamo questi script batch con la nostra applicazione Django, poiché dipende dall'applicazione models.py e forms.py.

L'unica parte "interessante" è trasformare la riga XML in un dizionario in modo che funzioni perfettamente con le forme di Django. Oltre a questo, questo programma da riga di comando utilizza tutti gli stessi componenti Django della tua vista.

Probabilmente vorrai aggiungere opzioni di analisi e registrazione per creare un'app completa da riga di comando. Noterai inoltre che gran parte della logica è generica: solo la funzione xmlToDict è veramente unica. Chiamiamo questi "Builder" e abbiamo una gerarchia di classi in modo che i nostri Builder siano tutti mappature polimorfiche dai nostri documenti sorgente ai dizionari Python.

+0

Nessun motivo per non implementare questo tipo di script come comando di gestione Django. Si integra con altri comandi in manage.py e si occupa di argomenti come l'analisi e l'analisi delle opzioni per te. Più "Djangoic". –

2

Ho usato cron per aggiornare il mio DB utilizzando sia uno script che una vista. Dal punto di vista di cron, in realtà non importa quale scegli. Come hai notato, però, è difficile battere la semplicità di accendere un browser e colpire un URL se si desidera aggiornare a intervalli non programmati.

Se si passa al percorso di visualizzazione, potrebbe valere la pena considerare una vista che accetta il file XML stesso tramite un POST HTTP. Se ciò ha senso per i tuoi dati (non fornisci molte informazioni su quel file XML), funzionerebbe comunque da cron, ma potrebbe anche accettare un caricamento da un browser - potenzialmente lasciando che la persona che produce il file XML aggiorni il DB da soli. Questa è una grande vittoria se non sei tu quello che crea il file XML, che di solito è il caso della mia esperienza.

+0

ottimo. consigliate le migliori pratiche? – jdcaballerov