Django脚本无需使用manage.py shell即可访问模型对象

时间:2011-11-08 07:30:21

标签: python django django-models

我正在编写一个脚本,将一些模型对象导入我的django应用程序使用的数据库中。在过去,我通过运行./manage.py shell然后import myscript解决了这个问题。我相信有更好的方法。我希望能够使用python scriptname.py从我的HD上的任何地方调用脚本,并且在该脚本的前几行中,它将执行任何必要的导入/其他操作,以便它可以访问模型对象和行为好像它是使用manage.py shell运行的。

我需要在脚本中添加什么才能实现此目的?

修改

基于@Melug的回答,添加了动态设置的Python路径来解决问题中“我HD上的任何地方”部分:

import sys
sys.path.append('c:\\my_projec_src_folder')
from myproject import settings
from django.core.management import setup_environ
setup_environ(settings)

12 个答案:

答案 0 :(得分:120)

自Django 1.4 以来,您应该避免使用setup_environ(settings)(由Melug发布),因为它已被弃用。请改用以下内容,您将能够访问您的模型

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")

# your imports, e.g. Django models
from your_project_name.models import Location

# From now onwards start your script..

以下是访问和修改模型的示例:

if __name__ == '__main__':    
    # e.g. add a new location
    l = Location()
    l.name = 'Berlin'
    l.save()

    # this is an example to access your model
    locations = Location.objects.all()
    print locations

    # e.g. delete the location
    berlin = Location.objects.filter(name='Berlin')
    print berlin
    berlin.delete()

示例模型:

class Location(models.Model):
    name = models.CharField(max_length=100)

答案 1 :(得分:94)

要加载模型,我必须将其与this answer结合使用,否则我会django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
import django
django.setup()

作为额外的,我将此添加到我的django项目的__init__.py,它将自动发现应用程序名称,以便它可以复制/粘贴:

import os


def setup():
    module = os.path.split(os.path.dirname(__file__))[-1]
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{}.settings".format(module))
    import django
    django.setup()

然后我可以这样做:

from <app> import setup
setup()

答案 2 :(得分:34)

我认为最好的方法是创建custom management command(s)。然后,您可以从任何地方拨打manage.py <yourcommand>

答案 3 :(得分:23)

对于Django 1.9或更高版本,您可以使用:

import sys
import os
import django

sys.path.append('your_project_directory')
os.environ['DJANGO_SETTINGS_MODULE'] = 'your_project.settings'
django.setup()

from yourapp.models import your_model

所以你可以使用对象作为相同的django对象:

from myapp.models. import Locations
all_locations = Locations.object.all()
first_location = Locations.object.get(id=1)
print first_location.name()
first_location.save()

答案 4 :(得分:21)

您需要先设置django环境:

from your_project import settings
from django.core.management import setup_environ
setup_environ(settings)

最后导入你的模型,一切都像django。

答案 5 :(得分:5)

FOR DJANGO 1.11

上层解决方案不起作用,但给了我一个错误:

django.core.exceptions.AppRegistryNotReady:尚未加载应用。

对我来说,来自here的解决方案已经解决了:

import os
from django.core.wsgi import get_wsgi_application

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
application = get_wsgi_application()

答案 6 :(得分:2)

以下是Django版本的答案&gt; 1.4:

from django.core.management import settings
from myproject.myproject import settings as project_settings

if not settings.configured:
  settings.configure(default_settings=project_settings)

答案 7 :(得分:2)

至少从Django 1.11开始,你的主应用程序包含一个wsgi模块,可以在导入时进行必要的设置。假设myproject/myproject是您的settings.py的位置,请在您的脚本中导入:

from myproject.wsgi import application

答案 8 :(得分:2)

对于django> = 2.0,足以完成这两次导入

from your_project_path import settings as your_project_settings
from django.core.management import settings

那么您只需from my_app.models import MyModel

并使用您的模型MyModel

答案 9 :(得分:0)

如果你得到:

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

尝试:

import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')
application = get_wsgi_application()

答案 10 :(得分:0)

尝试:

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

如果os.environ.setdefault不起作用。 (Windows 10,python3.6.4,django 2.0.3)

答案 11 :(得分:0)

正如Stavros指出的here,您可以复制wsgi.py并将其放在脚本的开头。除了设置DJANGO_SETTINGS_MODULE,您还需要获取应用程序。希望能帮助到你。它在Django 2.1.5上对我有效。

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'revochem.settings')

application = get_wsgi_application()