当syncdb与django-site的fixture时自动填充

时间:2010-10-14 14:19:08

标签: django django-sites

我想在最初运行syncdb后填充django_site表 我怎样才能做到这一点 我只有一个网站

3 个答案:

答案 0 :(得分:35)

简单的解决方案是为站点应用创建一个initial_data.json fixture,它将覆盖默认值。

例如,我在/myproject/myapp/fixtures/initial_data.json的灯具:

[
  {
    "model": "sites.site", 
    "pk": 1, 
    "fields": {
      "domain": "myproject.mydomain.com", 
      "name": "My Project"
    }
  }
]

注意:因为这是整个项目的常用数据,所以将夹具存储到/ myproject / fixtures /或app / myproject / commons /(就像我这样做)而不是存储它可能是个好主意。使用只是一些应用。这样可以使数据易于查找,并使应用程序更具可重用性。

第二个注意事项:Django允许在多个应用程序中使用多个initial_data.json装置(使用混合的initial_data.json和initial_data.yaml装置集合虽然没有按预期工作:P)。当syncdb运行时,它们都将自动用于预先填充数据库。

一些参考文献:

答案 1 :(得分: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_IDSITE_NAMESITE_DOMAIN添加到settings.py

答案 2 :(得分:4)

您可以使用shell中的管理界面,也可以编写脚本(如果您正在寻找自动化解决方案)。以下是如何从shell中执行此操作(以及您将在脚本中添加的内容):

[sledge@localhost projects]$ python manage.py shell
>>> from django.contrib.sites.models import Site
>>> newsite = Site(name="Test",domain="test.com")
>>> newsite.save()