8

从外部源将数据填充到 Django 模型中的最佳方法是什么?

例如,我有一个模型运行,并在一个 XML 文件中运行数据,该文件每周更改一次。

我应该创建一个视图并从 curl cronjob 调用该视图 URL(优点是可以随时读取该数据,而不仅仅是在 cronjob 运行时),还是创建一个 python 脚本并将该脚本安装为 cron(使用 DJANGO _SETTINGS _MODULE 在执行脚本之前设置变量)?

4

4 回答 4

11

有一种很好的方法可以在项目环境中完成一些类似维护的工作——编写一个自定义的 manage.py 命令。它需要所有环境配置和其他东西,让您专注于具体任务。

当然也可以直接通过 cron 调用。

于 2009-02-07T18:43:12.570 回答
4

您不需要创建视图,只需触发一个配置了适当 Django 环境设置的 python 脚本。然后像使用视图一样直接调用模型,处理数据,将其添加到模型中,然后将模型 .save() 保存到数据库中。

于 2009-02-07T18:03:44.007 回答
2

“创建一个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.pyforms.py.

唯一“有趣”的部分是将您的 XML 行转换为字典,以便它与 Django 的表单无缝协作。除此之外,这个命令行程序使用所有与您的视图相同的 Django 组件。

您可能需要添加选项解析和日志记录,以制作一个完整的命令行应用程序。您还会注意到大部分逻辑是通用的——只有xmlToDict函数是真正独特的。我们将这些称为“构建器”并具有类层次结构,因此我们的构建器都是从源文档到 Python 字典的多态映射。

于 2009-02-07T19:26:13.700 回答
2

我使用 cron 来更新我的数据库,同时使用脚本和视图。从 cron 的角度来看,你选择哪一个并不重要。但是,正如您所指出的,如果您想以非计划的时间间隔进行更新,那么启动浏览器并点击 URL 的简单性是难以超越的。

如果您采用视图路由,则可能值得考虑通过 HTTP POST 接受 XML 文件本身的视图。如果这对您的数据有意义(您没有提供有关该 XML 文件的太多信息),它仍然可以通过 cron 工作,但也可以接受来自浏览器的上传——可能会让生成 XML 文件的人更新自己数据库。如果您不是制作 XML 文件的人,那将是一个巨大的胜利,根据我的经验,这通常是这种情况。

于 2009-02-07T19:33:52.437 回答