11

最初にsyncdbの後に実行するときにdjango_siteテーブルにデータを入力したいのですが、サイトが1つしかないのはどうすればよいですか

4

3 に答える 3

36

簡単な解決策は、デフォルトをオーバーライドする 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 の実行時にデータベースを事前設定するために自動的に使用されます。

参考文献:

于 2012-02-02T18:55:07.507 に答える
5

これを自動的に実行したい場合は、これを試してください

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

于 2011-12-20T16:31:43.760 に答える
4

シェルから管理インターフェイスを使用するか、スクリプトを作成することができます (自動化されたソリューションを探している場合)。シェルから実行する方法 (およびスクリプトに入力する内容) は次のとおりです。

[sledge@localhost projects]$ python manage.py shell
>>> from django.contrib.sites.models import Site
>>> newsite = Site(name="Test",domain="test.com")
>>> newsite.save()
于 2010-10-14T16:38:57.737 に答える