从外部源将数据填充到 Django 模型中的最佳方法是什么?
例如,我有一个模型运行,并在一个 XML 文件中运行数据,该文件每周更改一次。
我应该创建一个视图并从 curl cronjob 调用该视图 URL(优点是可以随时读取该数据,而不仅仅是在 cronjob 运行时),还是创建一个 python 脚本并将该脚本安装为 cron(使用 DJANGO _SETTINGS _MODULE 在执行脚本之前设置变量)?
从外部源将数据填充到 Django 模型中的最佳方法是什么?
例如,我有一个模型运行,并在一个 XML 文件中运行数据,该文件每周更改一次。
我应该创建一个视图并从 curl cronjob 调用该视图 URL(优点是可以随时读取该数据,而不仅仅是在 cronjob 运行时),还是创建一个 python 脚本并将该脚本安装为 cron(使用 DJANGO _SETTINGS _MODULE 在执行脚本之前设置变量)?
有一种很好的方法可以在项目环境中完成一些类似维护的工作——编写一个自定义的 manage.py 命令。它需要所有环境配置和其他东西,让您专注于具体任务。
当然也可以直接通过 cron 调用。
您不需要创建视图,只需触发一个配置了适当 Django 环境设置的 python 脚本。然后像使用视图一样直接调用模型,处理数据,将其添加到模型中,然后将模型 .save() 保存到数据库中。
“创建一个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
函数是真正独特的。我们将这些称为“构建器”并具有类层次结构,因此我们的构建器都是从源文档到 Python 字典的多态映射。
我使用 cron 来更新我的数据库,同时使用脚本和视图。从 cron 的角度来看,你选择哪一个并不重要。但是,正如您所指出的,如果您想以非计划的时间间隔进行更新,那么启动浏览器并点击 URL 的简单性是难以超越的。
如果您采用视图路由,则可能值得考虑通过 HTTP POST 接受 XML 文件本身的视图。如果这对您的数据有意义(您没有提供有关该 XML 文件的太多信息),它仍然可以通过 cron 工作,但也可以接受来自浏览器的上传——可能会让生成 XML 文件的人更新自己数据库。如果您不是制作 XML 文件的人,那将是一个巨大的胜利,根据我的经验,这通常是这种情况。