python queryset 如何在外部填充一個Django模型?




python django教學 (4)

“創建一個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模型的最佳方法是什麼?

例如,我有一個模型運行,並在一個XML文件,每週更改運行數據。

我應該創建一個視圖,並從curl cronjob中調用該視圖URL(這樣做的好處是可以隨時讀取數據,而不僅僅是在cronjob運行時),或者創建一個python腳本並將該腳本安裝為cron(使用DJANGO _SETTINGS執行腳本之前_MODULE變量設置)?


我已經使用cron來更新我的數據庫使用腳本和視圖。 從cron的角度來看,你選擇哪一個並不重要。 但是,正如你所指出的那樣,如果你想要以非定期的時間間隔進行更新的話,很難打敗瀏覽器並點擊URL的簡單性。

如果你走查看路線,可能值得考慮通過HTTP POST接受XML文件本身的視圖。 如果這對你的數據是有意義的(你不會提供關於那個XML文件的很多信息),它仍然可以從cron工作,但也可以接受來自瀏覽器的上傳 - 可能讓產生XML文件的人更新DB自己。 如果您不是製作XML文件的人,那麼這是一個巨大的勝利,通常我的經驗就是這樣。


在項目環境中有一些很好的方式來做類似維護的工作 - 寫一個自定義的manage.py命令 。 它需要所有的環境配置和其他的東西,讓你專注於具體的任務。

當然也可以通過cron直接調用它。


你不需要創建一個視圖,你應該觸發一個python腳本,並配置相應的Django環境設置 。 然後直接調用你的模型,如果你使用的是視圖,處理你的數據,將它添加到你的模型,然後將模型保存到數據庫。





django-models