8

外部ソースから Django モデルにデータを入力するための最良のアイデアは何ですか?

たとえば、Run というモデルがあり、毎週変更される XML ファイル内のデータを実行します。

ビューを作成し、curl cronjob からそのビュー URL を呼び出すか (cronjob の実行時だけでなく、いつでもデータを読み取ることができるという利点があります)、または Python スクリプトを作成してそのスクリプトを cron としてインストールする必要があります (DJANGO _SETTINGS を使用)スクリプトを実行する前に_MODULE変数を設定しますか?

4

4 に答える 4

11

プロジェクト環境でメンテナンスのようなジョブを実行するための優れた方法があります-カスタムmanage.pyコマンドを記述します。それはすべての環境構成を取り、他のものはあなたが具体的なタスクに集中することを可能にします。

そしてもちろん、cronで直接呼び出します。

于 2009-02-07T18:43:12.570 に答える
4

ビューを作成する必要はありません。適切なDjango 環境設定が構成された Python スクリプトをトリガーするだけです。次に、ビューを使用している場合と同じようにモデルを直接呼び出し、データを処理してモデルに追加し、モデルをデータベースに .save() します。

于 2009-02-07T18:03:44.007 に答える
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) )

ここには独自の処理がほとんどないことに注意してください。ビュー関数と同じ Form と Model を使用するだけです。

これらのバッチ スクリプトは、アプリケーションのmodels.pyおよびforms.py.

唯一の「興味深い」部分は、XML 行をディクショナリに変換して、Django のフォームとシームレスに連携できるようにすることです。それ以外は、このコマンドライン プログラムはビューと同じ Django コンポーネントをすべて使用します。

これから完全なコマンドライン アプリを作成するために、オプションの解析とログを追加することをお勧めします。また、ロジックの多くが汎用的であることにも気付くでしょうxmlToDict。真にユニークなのは関数だけです。これらを「ビルダー」と呼び、クラス階層を持っているため、ビルダーはすべてソース ドキュメントから Python 辞書へのポリモーフィック マッピングになります。

于 2009-02-07T19:26:13.700 に答える
2

cron を使用して、スクリプトとビューの両方を使用して DB を更新しました。cron の観点からは、どちらを選択しても問題ありません。ただし、お気づきのように、予定外の間隔で更新したい場合は、ブラウザーを起動して URL にアクセスするという単純さに勝るものはありません。

ビュー ルートに進む場合は、HTTP POST を介して XML ファイル自体を受け入れるビューを検討する価値があるかもしれません。それがあなたのデータにとって理にかなっている場合 (その XML ファイルについて多くの情報を提供しない場合)、それは引き続き cron から機能しますが、ブラウザーからのアップロードを受け入れることもできます。XML ファイルを作成した人が、自分でDB。あなたが XML ファイルを作成していない場合、これは大きなメリットです。これは、私の経験では通常のケースです。

于 2009-02-07T19:33:52.437 に答える