4

schema通常、かなり大きなjson文字列を含むdjangoモデルで呼び出されるフィールドがあります。新しいインスタンスが作成されるときに追加したいデフォルト値 (約 2000 文字) があります。

全体を変数にダンプするのはかなり不潔だと思いmodels.pyます。このデフォルト値をスキーマ ( TextField) にロードする最良の方法は何ですか?

例:

class LevelSchema(models.Model):
    user = models.ForeignKey(to=User)
    active = models.BooleanField(default=False)
    schema = models.TextField() # Need a default value for this

私はこれについて少し考えました。json ファイルを使用してデフォルト値をどこかに保存している場合、どこに配置するのが最適ですか? フォルダー内の同じアプリ内にある場合は、明らかに望ましいです。

4

2 に答える 2

1

テキストはかなり重いです。フォーマットされたjsonであるため、ファイルの半分にまたがります。これは、将来編集可能にしたいと考えています。Django にメソッドが既に存在するかどうかを知りたいというだけで、(フィクスチャのように) ファイルからロードすることを好みます。

django には、次の 2 つのオプションがあります。

  1. post_saveをリッスンし、createdが true の場合、ファイルを読み取ってオブジェクトのデフォルト値を設定します。

  2. デフォルトを呼び出し可能 (関数) に設定し、そのメソッドでファイルを読み取り (後で必ず閉じてください)、その内容を返します。

アクセスを高速化するために、データを k/v ストア (redis や memcache など) に保存することもできます。また、常にファイルを開いたり閉じたりする必要がないため、より良いでしょう。

最後に、最も制限的なオプションは、データの入力を行うデータベースにトリガーを設定することです。jsonをデータベースのどこかに保存する必要があります。このアプローチの追加の利点は、django フロント エンドを記述して json を更新できることです。欠点は、トリガーでサポートすることを決定したデータベースにアプリケーションが制限されることです。

于 2012-10-25T14:07:07.113 に答える
1

変数の使用は特に汚れていません。defaultただし、すべてのフィールドがサポートする引数が呼び出し可能である可能性があるという事実を「悪用」することができます。

だから、あなたはこの「クレイジー」なことをすることができます:

def get_default_json():
    json_text = open('mylargevalue.json').read()
    return json_text

そしてあなたのフィールドで:

schema = models.TextField(default=get_default_json)

私はそのようなものを試したことはありませんが、うまくいくと思います。

于 2012-10-25T14:01:15.983 に答える