2009-02-07 14 views
8

¿Cuál es la mejor idea para completar datos en un modelo de Django desde una fuente externa?¿Cómo llenar externamente un modelo de Django?

E.g. Tengo un modelo Ejecutar y ejecuta datos en un archivo XML, que cambia semanalmente.

Debería crear una vista y llamar a esa URL de vista desde un cronjob curl (con la ventaja de que los datos pueden leerse en cualquier momento, no solo cuando se ejecuta cronjob) o crear un script python e instalar ese script como cron (con la configuración de la variable DJANGO _SETTINGS _MODULE antes de ejecutar el script)?

Respuesta

10

Hay una excelente manera de hacer algunos trabajos similares a los de mantenimiento en el entorno del proyecto: escriba un custom manage.py command. Toma toda la configuración del entorno y otras cosas le permite concentrarse en tareas concretas.

Y, por supuesto, llámalo directamente por cron.

4

No necesita crear una vista, solo debe activar una secuencia de comandos python con el Django environment settings configured apropiado. Luego llame a sus modelos directamente como lo haría si estuviera usando una vista, procese sus datos, agréguelos a su modelo y luego guarde() el modelo en la base de datos.

+0

Puedo hacerlo desde ambos lados, guárdelo de la vista o guárdelo desde el script de python. – Marius

+0

Un comando de administración personalizado es una mejor solución que cambiar la configuración del entorno de Django usted mismo. Ver la respuesta de Daevaorn. –

2

"crear una secuencia de comandos python e instalar esa secuencia de comandos como cron (con la configuración de la variable DJANGO _SETTINGS _MODULE antes de ejecutar la secuencia de comandos)?"

En primer lugar, asegúrese de declarar sus formularios en un módulo separado (por ejemplo forms.py)

A continuación, puede escribir cargadores lotes que se ven así. (Tenemos una gran cantidad de estos.)

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

Tenga en cuenta que hay muy poco procesamiento única aquí - sólo se utiliza la misma forma y el modelo como sus funciones de vista.

Ponemos estos scripts por lotes con nuestra aplicación Django, ya que depende de la aplicación models.py y forms.py.

La única parte "interesante" es transformar su fila XML en un diccionario para que funcione a la perfección con los formularios de Django. Aparte de eso, este programa de línea de comandos usa todos los mismos componentes de Django como su vista.

Es probable que desee agregar el análisis y el registro de opciones para hacer una aplicación de línea de comandos completa de esto. También notará que gran parte de la lógica es genérica: solo la función xmlToDict es verdaderamente única. Llamamos a estos "Constructores" y tenemos una jerarquía de clases para que nuestros Constructores sean todas las asignaciones polimórficas de nuestros documentos de origen a los diccionarios de Python.

+0

No hay razón para no implementar este tipo de script como un comando de administración de Django. Se integra con otros comandos en manage.py y se encarga de analizar argumentos como opciones y opciones. Más "Djangoic". –

2

He utilizado cron para actualizar mi base de datos usando un script y una vista. Desde el punto de vista de cron, realmente no importa cuál elijas. Sin embargo, como habrás notado, es difícil superar la simplicidad de activar un navegador y pulsar una URL si alguna vez deseas actualizar en un intervalo no programado.

Si va por la ruta de vista, podría valer la pena considerar una vista que acepte el archivo XML en sí a través de un HTTP POST. Si eso tiene sentido para sus datos (no proporciona mucha información sobre ese archivo XML), aún funcionaría desde cron, pero también podría aceptar una carga desde un navegador, lo que permitiría que la persona que produce el archivo XML actualice la DB por ellos mismos. Es una gran ganancia si no eres tú quien hace el archivo XML, que generalmente es el caso en mi experiencia.

+0

genial. ¿Alguna de las mejores prácticas recomendadas? – jdcaballerov

Cuestiones relacionadas