2009-02-07 118 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文件的人,那麼這是一個巨大的勝利,根據我的經驗,這通常是這種情況。