¿Fue útil?

Solución

Todos los comandos de administración de Django se puede acceder mediante programación :

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

Lo ideal sería utilizar una señal de pre-INIT en runserver para activar esto, pero tal señal doesn' t existen . Así que, en realidad, la forma en que manejaría esto si yo fuera usted sería la creación de un comando de administración personalizado, como runserver_newdb, y ejecutar esta dentro de él:

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

la documentación para obtener más información sobre cómo escribir personalizada comandos de gestión.

Otros consejos

Como sugiere " Dónde poner el código Django inicio? ", puede utilizar el middleware para su código de inicio. La documentación de Django son aquí .

Por ejemplo (no probado):

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')

y en su settings.py:

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

     # Existing middleware classes here
 )

Actualizar

He añadido un script llamado run.sh en el directorio raíz del proyecto. Esto funcionó para mí con una base de datos SQLite:

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

Respuesta original

No estoy seguro de entender lo que quiere decir con "el procesamiento del comando syncdb". Por lo general, ejecutar python manage.py syncdb desde la línea de comandos. Esto se hace generalmente después de añadir nuevos modelos. En caso de que quiera a realizar con facilidad esta utilizando un simple script de shell. No veo ninguna razón para el lugar (o invocar) syncdb desde dentro settings.py.

¿Es posible añadir más detalles a su pregunta? Añadir contexto y explicar qué es exactamente estás tratando de conseguir hecho?

Se puede crear un nuevo guión que se llama en lugar de que las llamadas manage.py manage.py:

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

Si usted no necesita agregar un administrador puede cambiar la segunda línea como la siguiente:

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

Estoy asumiendo que lo que estamos tratando de hacer es crear su base de datos y luego iniciar el servidor con un comando cada vez.

La respuesta de @ Daniel Naab, así como el documento en el sitio oficial, no es para ejecutar comandos de administración como un punto de entrada.

Cuando se desea utilizar un comando de gestión como el punto de entrada en el entorno de la nube gestionada como AWS Lambda o Funciones de Google Cloud, puede echar un vistazo a manage.py y probar algo similar.

import os
from django.core.management import execute_from_command_line

def publishing_fn(data, context):
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'YOURAPP.settings')
    # The first argument is "manage.py" when it's run from CLI.
    # It can be an empty string in this case
    execute_from_command_line(['', 'COMMAND', 'ARGS...'])
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top