2009-02-07 80 views
8

从外部来源填充数据到Django模型的最佳想法是什么?如何在外部填充Django模型?

E.g.我有一个模型运行,并在每周更改的XML文件中运行数据。

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

回答

10

在项目环境中有一些很好的方法可以做类似维护的工作 - 写一个custom manage.py command。它需要所有的环境配置和其他的东西,让你专注于具体的任务。

当然直接用cron调用它。

4

你不需要创建一个视图,你应该触发一个合适的Django environment settings configured的Python脚本。然后直接调用您的模型,如果您使用视图,处理数据,将其添加到模型中,然后将模型保存到数据库中。

+0

我可以从两侧做到这一点,从视图保存或保存从Python脚本。 – Marius 2009-02-07 18:24:06

+0

自定义管理命令比自己更改Django环境设置更好。看到Daevaorn的回答。 – 2009-02-08 15:36:35

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函数是真正独特的。我们称这些为“Builders”,并有一个类层次结构,以便我们的构建器都是从源文档到Python词典的多态映射。

+0

没有理由不将这种脚本实现为Django管理命令。它与manage.py中的其他命令集成在一起,它为您处理参数和选项解析等操作。更多“Djangoic”。 – 2009-02-08 15:56:47

2

我已经使用cron使用脚本和视图更新我的数据库。从cron的角度来看,你选择哪一个并不重要。但是,正如你所指出的那样,如果你想要以非定期的时间间隔更新,就很难击败浏览器并点击URL的简单性。

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