Как внешне заселить модель Джанго? - PullRequest
8 голосов
/ 07 февраля 2009

Какова лучшая идея для заполнения данных в модель Django из внешнего источника?

например. У меня есть модель Run, и я запускаю данные в файле XML, который меняется еженедельно.

Должен ли я создать представление и вызвать его URL-адрес из завитка кроны (с преимуществом, что эти данные могут быть прочитаны в любое время, а не только во время выполнения кронштейна), или создать скрипт Python и установить этот скрипт как cron с настройкой переменной DJANGO _SETTINGS _MODULE перед выполнением сценария)?

Ответы [ 4 ]

11 голосов
/ 07 февраля 2009

Существует отличный способ выполнить некоторые задачи, подобные обслуживанию, в среде проекта - напишите пользовательскую команду manage.py . Требуется вся конфигурация среды, а другие вещи позволяют сосредоточиться на конкретной задаче.

И, конечно, назовите его напрямую через cron.

4 голосов
/ 07 февраля 2009

Вам не нужно создавать представление, вам нужно просто запустить скрипт Python с соответствующими настройками среды Django, настроенными . Затем вызовите ваши модели напрямую, как если бы вы использовали представление, обработайте данные, добавьте их в модель, а затем .save () - модель в базу данных.

2 голосов
/ 07 февраля 2009

Я использовал cron для обновления моей БД, используя как скрипт, так и представление. С точки зрения cron, на самом деле не имеет значения, какой вы выберете. Однако, как вы заметили, трудно превзойти простоту запуска браузера и перехода по URL-адресу, если вы когда-нибудь захотите обновить его в незапланированный интервал.

Если вы идете по маршруту просмотра, возможно, стоит рассмотреть представление, которое принимает сам файл XML через HTTP POST. Если это имеет смысл для ваших данных (вы не предоставляете много информации об этом XML-файле), он все равно будет работать из cron, но также может принять загрузку из браузера - потенциально позволяя человеку, который создает XML-файл, обновить БД под себя. Это большая победа, если вы не тот, кто создает XML-файл, как обычно бывает в моем опыте.

2 голосов
/ 07 февраля 2009

"создать сценарий python и установить этот сценарий как cron (с настройкой переменной DJANGO _SETTINGS _MODULE перед выполнением сценария)?"

Сначала обязательно объявите свои формы в отдельном модуле (например, forms.py)

Затем вы можете написать пакетный загрузчик, который выглядит следующим образом. (У нас их много.)

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

Обратите внимание, что здесь очень мало уникальной обработки - она ​​просто использует ту же форму и модель, что и функции вашего представления.

Мы добавили эти пакетные сценарии в наше приложение Django, поскольку оно зависит от models.py и forms.py.

приложения.

Единственная «интересная» часть - это преобразование строки XML в словарь, чтобы она без проблем работала с формами Django. Кроме этого, эта программа командной строки использует все те же компоненты Django, что и ваш вид.

Возможно, вы захотите добавить параметры разбора и ведения журнала, чтобы сделать из этого полноценное приложение командной строки. Вы также заметите, что большая часть логики является общей - только функция xmlToDict действительно уникальна. Мы называем их «Builders» и имеем иерархию классов, так что все наши Builders являются полиморфными отображениями из наших исходных документов в словари Python.

...