5

私のプロジェクトは、API リクエストの作成 (JSON の取得) と、それらのリクエストからの情報の出力を中心に構築されています。リクエストの 60 ~ 80% は、めったに変更されない静的データをリクエストしています。この静的データをデータベースに保存して、その静的データにすべてのリクエストを費やす必要がないようにしたいと考えています。

これらのリクエストの 1 つだけから得られるすべての情報を保持するモデルをセットアップしました。リクエストからの情報を実際にそのデータベースに入力するためのコードをどこに置くべきかわかりません。

モデル

 class Champion(models.Model):
     id = models.IntegerField(primary_key=True)
     name = models.CharField(max_length=100)
     title = models.CharField(max_length=255)
     image = models.CharField(max_length=5000)
     ...

基本的に、私は 2 つのリクエストを行う必要があることを知っています。1 つはすべての ID を取得し、それらの ID をループして、データベースにチャンピオンを作成するリクエストを行います。私はすでにそれを行うためのコードを書いていますが、このコードをどこに置くべきか、またはそれにアクセスする方法がわかりません。

4

2 に答える 2

5

言い換えれば、リモート API とローカルの django を利用したサイトがあります。各リクエストでリモート API からデータを取得したくないため、ローカルに保存します。その場合、データをリモート データと同期する必要があります。問題は、同期を開始する方法です。

いくつかの可能性がありますが、最初に同期を実行するタイミングを検討する必要があります。

  • 毎日/毎時/毎週/毎月?
  • 手で/要求に応じて?
  • データが変更されたとき (リモート API の何らかのメソッド、最後の変更を確認)?

データが変更されたとき、または一定期間のデータの後に同期する場合は、もう 1 つの質問に答える必要があります。同期がリクエストにどのように影響するかということです。リクエスト中に同期を処理しても問題ないのか、それとも同期中に呼び出されたリクエストがまだ古いデータを返しても問題ないのか?

要求に応じて同期する場合は、同期コードをカスタム管理コマンド内に配置するか、同期を実行する別のビュー (承認されたアクセスのみ) に配置するだけです。

通常のリクエスト中に同期を行っても問題ない場合は、前回の同期からの時間が X を超えているか、リモート API のデータが更新されたか、または他の条件が満たされているかを各リクエストで確認し、レスポンスを返す前に同期を実行することができます(競合状態! )。

リクエスト中にそれを行いたくない場合 (同期が行われているときに行われたリクエストがまだ古いデータを返しても問題ありません)、セロリまたはシステム cron ジョブを使用できます。

Celery はオンデマンドでタスクを実行できます (たとえば、リクエストで、リモート データが変更されたかどうかを確認するときに、非同期タスクを実行して同期を実行し、古いデータに基づいて応答を返すことができます)、または定期的にタスクを実行できます (cron ジョブなど)。通常の cron タスクでは、上記のようにカスタム管理コマンドを使用できます。

于 2015-08-21T12:22:04.410 に答える
2

プロジェクト ディレクトリ内に python ファイルを作成し、以下のコードを含めます。この python スクリプトを実行するには、端末から python filename.py と言うだけです。乾杯!

import os
import django

logger = logging.getLogger(__name__)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")

django.setup()

from your_app_name import models

for champ in Champion.objects.all():
    try:
        #make your API request here
        #suppose champ_image is what you retrieve from the API
        champ.image = champ_image
        champ.save()
        print "updated:"+champ.name
    except:
        print "could not save:"+champ.name
print "Action complete!"
于 2015-08-21T12:37:54.803 に答える