从外部源将数据填充到Django模型中的最佳方法是什么?
E.g。我有一个模型Run,并在XML文件中运行数据,该文件每周更改一次。
我应该创建一个视图并从curl cronjob调用该视图URL(其优点是可以随时读取该数据,而不仅仅是在运行cronjob时),或者创建一个python脚本并将该脚本安装为cron(在执行脚本之前使用DJANGO _SETTINGS _MODULE变量设置??
答案 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.py
和forms.py
。
唯一“有趣”的部分是将XML行转换为字典,以便与Django的表单无缝协作。除此之外,这个命令行程序使用所有相同的Django组件作为您的视图。
您可能希望添加选项解析和日志记录,从而创建一个完整的命令行应用程序。您还会注意到,许多逻辑都是通用的 - 只有xmlToDict
函数才是真正独特的。我们将这些称为“构建器”并具有类层次结构,以便我们的构建器都是从源文档到Python字典的多态映射。
答案 3 :(得分:2)
我使用cron使用脚本和视图更新我的数据库。从cron的角度来看,选择哪一个并不重要。但是,正如您所指出的那样,如果您想要以非预定的时间间隔进行更新,那么很难击败启动浏览器和点击URL的简单性。
如果你进入视图路径,可能值得考虑一个通过HTTP POST接受XML文件本身的视图。如果这对您的数据有意义(您没有提供有关该XML文件的大量信息),它仍然可以在cron中运行,但也可以接受从浏览器上传 - 可能会让生成XML文件的人更新DB自己。如果您不是制作XML文件的人,那将是一个巨大的胜利,这在我的经验中通常就是这样。