私はDjangoにいくつかのサイトワイズの固定オブジェクトを持っています。インスタンス化する必要がある固定オブジェクトはいくつかあります。1回限りのDjangoオブジェクトを初期化するにはどうすればいいですか?
たとえば、いくつかの(たとえばPermission
s)私はそれらが特定の順序で読み込まれることを確信できないので、私はハードコーディングできません(もしpk = nullを使用すると、 IntegrityError(既に存在する場合)
その他(例:Site
s)は、settings.py
の値に依存します。 編集:これらは、プロジェクトがデプロイされるたびに実行する必要があります。そうでなければ、以下のsuper9の提案に従ってSouthのデータ移行を使用できます。
これらはDjangoモデルなので、プロジェクト内のどのアプリケーションとも直接関係していません。 settings.py
にロードするのが最も理にかなっていますが、その結果、循環インポートされます。それはurls.py
で動作しますが、ローディングコードを置くと、ハッキリと外れているようです。
私は次のようにpost_syncdb
に受信機をフックに見えた:
@receiver(post_syncdb)
def create_groups_and_permissions(sender, **kwargs):
print "Creating groups and permissions"
u_ct = ContentType.objects.get(model="user")
Group.objects.get_or_create(name='Group 1')
Permission.objects.get_or_create(name="Perm 1", codename="perm_1", content_type=u_ct)
しかし、私はテーブルが最初に作成されたときに、それが唯一post_syncdb
を送信documentationごとに、南を使用していますので、。移行するたびに手動でsyncdb
と呼ぶことができますが、そうしないことをお勧めします。
urls.py
または最も関連性の高いアプリのmodels.py
にそれらを入れることはほぼ解決されましたが、フィクスチャとして読み込めない固定オブジェクトを読み込む方法があるかどうかをここで確認します。
残念ながら、プロジェクトを展開するたびに実行する必要があり、データの移行は1回限りで済みます。これは、単一作成のインスタンスには最適です。これを反映するために最初の投稿を更新します。 –
必要なオブジェクトを作成する管理コマンドを書くのはどうですか? – super9
これは最もクリーンなオプションかもしれません。私の展開プロセスからそのオプションを呼び出してください。私はプロジェクトに自動的にロードされることを望んでいましたが、それを行うためのきれいな方法ではないようです。ありがとう。 –