最初にsyncdbの後に実行するときにdjango_siteテーブルにデータを入力したいのですが、サイトが1つしかないのはどうすればよいですか
3 に答える
簡単な解決策は、デフォルトをオーバーライドする Sites アプリ用の initial_data.json フィクスチャを作成することです。
たとえば、/myproject/myapp/fixtures/initial_data.json にある私のフィクスチャ:
[
{
"model": "sites.site",
"pk": 1,
"fields": {
"domain": "myproject.mydomain.com",
"name": "My Project"
}
}
]
ちょっとした注意: これはプロジェクト全体の共通データであるため、フィクスチャを /myproject/fixtures/ またはアプリ /myproject/commons/ に保存することをお勧めします (私のように) 。アプリ。これにより、データを見つけやすくなり、アプリを再利用しやすくなります。
2 番目の注意: Django では、複数のアプリで複数の initial_data.json フィクスチャを使用できます (initial_data.json と initial_data.yaml フィクスチャの混合セットを使用しても、期待どおりに動作しませんでした:P)。これらはすべて、syncdb の実行時にデータベースを事前設定するために自動的に使用されます。
参考文献:
- Django - 初期データをフィクスチャで提供する
- codespatter.com ブログ投稿の 2 番目のコメント
これを自動的に実行したい場合は、これを試してください
from django.contrib import sites
from django.db.models import signals
from django.conf import settings
def create_site(app, created_models, verbosity, **kwargs):
"""
Create the default site when when we install the sites framework
"""
if sites.models.Site in created_models:
sites.models.Site.objects.all().delete()
site = sites.models.Site()
site.pk = getattr(settings, 'SITE_ID', 1)
site.name = getattr(settings, 'SITE_NAME', 'Example')
site.domain = getattr(settings, 'SITE_DOMAIN', 'example.com')
site.save()
signals.post_syncdb.connect(create_site, sender=sites.models)
そのコードは、管理コマンドが実行されるたびに実行する必要があります。management/__init__.py
だから、あなたはそれをどんなアプリにも入れることができます。SITE_ID
次に、、、SITE_NAME
およびをに追加SITE_DOMAIN
しますsettings.py
。
シェルから管理インターフェイスを使用するか、スクリプトを作成することができます (自動化されたソリューションを探している場合)。シェルから実行する方法 (およびスクリプトに入力する内容) は次のとおりです。
[sledge@localhost projects]$ python manage.py shell
>>> from django.contrib.sites.models import Site
>>> newsite = Site(name="Test",domain="test.com")
>>> newsite.save()