В django, как мне вызвать подкоманду syncdb из инициализации script?

Я новичок в python и django, и, следуя Django Book, я узнал о команде "python manage.py syncdb", которая сгенерированные таблицы базы данных для меня. В среде разработки я использую sqlite в базе данных памяти, поэтому он автоматически стирается каждый раз, когда я перезапускаю сервер. Итак, как мне сделать script эту команду "syncdb" (если это нужно сделать в файле settings.py?)

РАЗЪЯСНЕНИЕ

OP использует базу данных в памяти, которая должна быть инициализирована в начале любого процесса, работающего с моделями Django, определенными против этой базы данных. Каков наилучший способ гарантировать инициализацию базы данных (один раз за начало процесса). Это было бы для запуска тестов или запуска сервера либо через manage.py runserver, либо через процесс веб-сервера (например, с WSGI или mod_python).

Ответ 1

Все команды управления Django могут быть доступны программно:

from django.core.management import call_command
call_command('syncdb', interactive=True)

В идеале вы должны использовать сигнал pre-init на runserver, чтобы активировать это, но такой сигнал не существует. Итак, на самом деле, как бы я справился с этим, если бы я был вами, вы должны были создать настраиваемую команду управления, например runserver_newdb, и выполнить ее внутри нее:

from django.core.management import call_command
call_command('syncdb', interactive=True)
call_command('runserver')

Подробнее о написании пользовательских команд управления см. документацию.

Ответ 2

Как предложено "Где поставить код запуска Django?", вы можете использовать промежуточное программное обеспечение для вашего кода запуска. Документы Django здесь.

Например (непроверенный):

startup.py:

from django.core.exceptions import MiddlewareNotUsed
from django.conf import settings
from django.core.management import call_command

class StartupMiddleware(object):
    def __init__(self):
        # The following db settings name is django 1.2.  django < 1.2 will use settings.DATABASE_NAME
        if settings.DATABASES['default']['NAME'] == ':memory:':
            call_command('syncdb', interactive=False)

        raise MiddlewareNotUsed('Startup complete')

и в вашем settings.py:

 MIDDLEWARE_CLASSES = (
     'your_project.middleware.startup.StartupMiddleware',

     # Existing middleware classes here
 )

Ответ 3

Обновление

Я добавил script, называемый run.sh в корневой каталог проекта. Это работало для меня с базой данных SQLite:

#!/usr/bin/python
from django.core.management import call_command
call_command('syncdb')
call_command('runserver')

Оригинальный ответ

Я не уверен, что понимаю, что вы подразумеваете под сценарием команды syncdb. Обычно вы выполняете python manage.py syncdb из командной строки. Обычно это делается после добавления новых моделей. Если вы хотите, чтобы вы легко выполнили это с помощью простой оболочки script. Я не вижу причин помещать (или вызывать) syncdb из settings.py.

Не могли бы вы добавить дополнительные сведения к своему вопросу? Добавьте контекст и объясните, что именно вы пытаетесь сделать?

Ответ 4

Вы можете создать новый script, который вы вызываете вместо manage.py, который вызывает manage.py:

from subprocess import call
call(["python", "manage.py", "syncdb"])
call(["python", "manage.py", "runserver"])

Если вам не нужно добавлять администратора, вы можете изменить вторую строку следующим образом:

call(["python", "manage.py", "syncdb", "--noinput"])

Я предполагаю, что вы пытаетесь создать свой db, а затем запускайте свой сервер с помощью одной команды каждый раз.