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

soF*_*eld 11 django django-sites

我想在syncdb之后运行时填充django_site表我怎么能这样做我只有一个站点

Aks*_*lén 35

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

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

[
  {
    "model": "sites.site", 
    "pk": 1, 
    "fields": {
      "domain": "myproject.mydomain.com", 
      "name": "My Project"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

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

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

一些参考:


And*_*dge 5

您可以从 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()
Run Code Online (Sandbox Code Playgroud)

  • 我的理解是,固定装置是执行此操作的首选方式。请参阅下面@Askell 的回答。 (2认同)

Mic*_*ior 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)
Run Code Online (Sandbox Code Playgroud)

只要执行管理命令,就需要运行该代码.所以你可以把它放进management/__init__.py任何应用程序.然后只需添加SITE_ID,SITE_NAMESITE_DOMAIN你的settings.py.