【问题标题】:How to externally populate a Django model?如何在外部填充 Django 模型?
【发布时间】:2010-10-06 04:04:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

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

    【讨论】:

    • 我可以从两边都这样做,从视图中保存或从 python 脚本中保存。
    • 自定义管理命令是比自己修改 Django 环境设置更好的解决方案。请参阅 Daevaorn 的回答。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      “创建一个 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 字典的多态映射。

      【讨论】:

      • 没有理由不将这种脚本实现为 Django 管理命令。它与 manage.py 中的其他命令集成,并为您处理参数和选项解析等事情。更多“Djangoic”。
      【解决方案4】:

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

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

      【讨论】:

      • 太棒了。有没有推荐的最佳做法?
      猜你喜欢
      • 2016-05-17
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 2018-06-26
      • 2012-12-23
      • 2012-02-23
      相关资源
      最近更新 更多