2008-10-08 11 views
7

Me gustaría ejecutar un script para rellenar mi base de datos. Me gustaría acceder a él a través de la API de la base de datos Django.¿Qué debo importar para tener acceso a mis modelos?

El único problema es que no sé lo que necesitaría importar para obtener acceso a esto.

¿Cómo se puede lograr esto?

Respuesta

12

Importe su módulo de preferencias también

import os 
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings" 

from mysite.polls.models import Poll, Choice 

debe hacer el truco.

0

Además de los archivos de sus propios modelos, también debe importar su módulo de configuración.

5

Si utiliza el argumento shell al guión manage.py en el directorio del proyecto, que no tiene que importar los ajustes de forma manual:

$ cd mysite/ 
$ ./manage.py shell 
Python 2.5.2 (r252:60911, Jun 10 2008, 10:35:34) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from myapp.models import * 
>>> 

Para el uso no interactivo se podría implementar un custom command y ejecutarlo con manage.py.

+0

A menos que me falta algo, manage.py no tiene un subcomando runscript en Django 1.0. Si está utilizando una aplicación personalizada para proporcionar esta funcionalidad, debe mencionarla. –

6

Esto es lo que tengo en la parte superior de mis scripts de carga de datos.

import string 
import sys 
try: 
    import settings # Assumed to be in the same directory. 
    #settings.DISABLE_TRANSACTION_MANAGEMENT = True 
except ImportError: 
    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) 
sys.exit(1) 

#Setup the django environment with the settings module. 
import django 
import django.core.management 
django.core.management.setup_environ(settings) 

from django.db import transaction 

Esto debería ejecutarse antes de hacer mucho más en su secuencia de comandos.

Otro método es usar dispositivos y manage.py. Aunque si solo está tratando de lograr una carga de datos masiva para inicializar una base de datos, esto debería funcionar bien.

Además, dependiendo de lo que esté haciendo, puede o no querer hacerlo todo en una transacción. Descomente la línea de transacción anterior y estructure su código de manera similar.

transaction.enter_transaction_management() 
try: 
    #Do some stuff 
    transaction.commit() 
finally: 
    transaction.rollback() 
    pass 
transaction.leave_transaction_management() 
+0

+1, cuando se ejecuta en la raíz de mi proyecto, la respuesta aceptada anteriormente no funciona, ¡pero la suya sí! – pufferfish

+1

¿No debería sangrar la línea "sys.exit (1)"? –

1

La solución más limpia es agregar extensiones django.

 
(virt1)[email protected]:~/Documents/prive/rugby-club/proposal/kitu$ yolk -l 
Django   - 1.3.1  - active 
Pygments  - 1.4   - active 
Python   - 2.6.5  - active development (/usr/lib/python2.6/lib-dynload) 
django-extensions - 0.7.1  - active 
pip    - 1.0.2  - active 
setuptools  - 0.6c11  - active 
wsgiref   - 0.1.2  - active development (/usr/lib/python2.6) 
yolk   - 0.4.1  - active 

La lista de posibles comandos a continuación, se extiende con entre otras cosas, el comando runscript.

Cuestiones relacionadas