Django 1.11
Pitón 3.6.1
Para que mi proyecto se despliegue, tendré que predefinir algunas cosas. Es decir, necesitaré un par de grupos para usuarios.
Entonces, hice una "implementación" de directorio y la coloqué al lado del directorio del proyecto.
Cuando se cree una nueva base de datos, simplemente ejecutaré:
python manage.py shell < ../deployment/initialize_project.pyEste código funciona:
from django.contrib.auth.models import Group Group.objects.create(name="commentator") # Can only comment. Group.objects.create(name="contributor") # Can add, change and delete # objects.Este código no :
from django.contrib.auth.models import Group def initialize_roles(): Group.objects.create(name="commentator") # line 6 Group.objects.create(name="contributor") initialize_roles() # line 12Rastrear:
Traceback (most recent call last): File "manage.py", line 22, in <module> execute_from_command_line(sys.argv) File "/home/michael/workspace/venv/photoarchive/lib/python3.6/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line utility.execute() File "/home/michael/workspace/venv/photoarchive/lib/python3.6/site-packages/django/core/management/__init__.py", line 355, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/michael/workspace/venv/photoarchive/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv self.execute(*args, **cmd_options) File "/home/michael/workspace/venv/photoarchive/lib/python3.6/site-packages/django/core/management/base.py", line 330, in execute output = self.handle(*args, **options) File "/home/michael/workspace/venv/photoarchive/lib/python3.6/site-packages/django/core/management/commands/shell.py", line 101, in handle exec(sys.stdin.read()) File "<string>", line 12, in <module> File "<string>", line 6, in initialize_roles NameError: name 'Group' is not definedMarqué las líneas 6 y 12 en el código anterior (como comentarios en línea).
Intenté usar pdb.set_trace(), pero aparece el mismo error. Como si pdb no estuviera definido.
También traté de no alimentar a manage.py en initialize_project.py, sino simplemente ejecutar python manage.py shell y alimentar el código línea por línea. Funcionó perfectamente.
¿Podrías darme una patada aquí?
AÑADIDO MÁS TARDE
Esto funciona:
def initialize_roles(): from django.contrib.auth.models import Group Group.objects.create(name="commentator") # Can only comment. Group.objects.create(name="contributor") # Can add, change and delete # objects. initialize_roles()A menos que haya algo más en lo que estás haciendo, esto se siente como algo que los accesorios están destinados a resolver. Si hay más, puede agregar migraciones de datos personalizadas como parte del proceso de configuración inicial. Eso evitará tener que preocuparse de cuándo hay modelos disponibles para usted.
Me enfrenté a una situación similar: este comportamiento es extraño, de hecho. Parece que dentro de esta función, faltan todas las importaciones (lo verifiqué con dir() - estaba vacío), pero no sé por qué. Sería genial si alguien pudiera responder eso.
No creo que sea elegante mantener el script desenvuelto por función, y como me enfrentaba a lo mismo, encontré este hilo útil (respuesta de danodonovan): Python Script from Django shell . Lo que sugiere es crear un subdirectorio de commands y agregarle un script (por ejemplo, init_db ). Entonces puedes ejecutar fácilmente:
./manage.py init_dbEsto resuelve los problemas indicados en su pregunta, pero no responde por qué sucede. Espero que alguien explique eso.