如何在外部填充Django模型?

时间:2009-02-07 17:54:54

标签: python django django-models

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

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

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

4 个答案:

答案 0 :(得分:11)

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

当然是由cron直接称呼它。

答案 1 :(得分:4)

您不需要创建视图,只需使用相应的Django environment settings configured触发python脚本即可。然后直接调用模型,就像使用视图一样,处理数据,将模型添加到模型中,然后将模型存储到数据库中。

答案 2 :(得分: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字典的多态映射。

答案 3 :(得分:2)

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

如果你进入视图路径,可能值得考虑一个通过HTTP POST接受XML文件本身的视图。如果这对您的数据有意义(您没有提供有关该XML文件的大量信息),它仍然可以在cron中运行,但也可以接受从浏览器上传 - 可能会让生成XML文件的人更新DB自己。如果您不是制作XML文件的人,那将是一个巨大的胜利,这在我的经验中通常就是这样。

相关问题