名称“组”未定义

时间:2017-04-11 15:06:35

标签: python django

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

2 个答案:

答案 0 :(得分:0)

除非你做的更多,否则感觉就像fixtures要解决的问题。如果还有更多内容,您可以在初始设置过程中添加custom data migrations。这样可以避免担心何时可以使用模型。

答案 1 :(得分:0)

我也遇到过类似的情况-这种行为确实很奇怪。看起来像在此函数内部,所有导入都丢失了(我用dir()进行了检查-它为空),但我不知道为什么。如果有人能够回答,那就太好了。

我认为保持脚本不被函数包装不优雅,并且当我面对同一件事时,我发现此线程很有用(danodonovan的回答):Python Script from Django shell。他的建议是创建commands子目录,并向其中添加脚本(例如init_db)。然后,您可以轻松运行:

./manage.py init_db

这可以解决您的问题中提到的问题,但不能回答为什么会发生。 我希望有人能解释。