Django 1.11
Python 3.6.1
因为要部署我的项目,我将不得不预先确定一些事情。也就是说,我需要为用户提供几个小组。
因此,我创建了一个目录“deployment”并将其放在项目目录旁边。
当创建新数据库时,我将执行:
python manage.py shell < ../deployment/initialize_project.py
此代码有效:
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.
此代码不:
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 12
回溯:
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 defined
我在上面的代码中标记了第6行和第12行(作为内联注释)。
我尝试使用pdb.set_trace(),但出现了同样的错误。好像没有定义pdb。
我也尝试过不在initialize_project.py上提供manage.py,而只是运行python manage.py shell并逐行提供代码。它运作得很好。
你能帮我一把吗?稍后添加
这有效:
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()
答案 0 :(得分:0)
除非你做的更多,否则感觉就像fixtures要解决的问题。如果还有更多内容,您可以在初始设置过程中添加custom data migrations。这样可以避免担心何时可以使用模型。
答案 1 :(得分:0)
我也遇到过类似的情况-这种行为确实很奇怪。看起来像在此函数内部,所有导入都丢失了(我用dir()进行了检查-它为空),但我不知道为什么。如果有人能够回答,那就太好了。
我认为保持脚本不被函数包装不优雅,并且当我面对同一件事时,我发现此线程很有用(danodonovan的回答):Python Script from Django shell。他的建议是创建commands
子目录,并向其中添加脚本(例如init_db
)。然后,您可以轻松运行:
./manage.py init_db
这可以解决您的问题中提到的问题,但不能回答为什么会发生。 我希望有人能解释。