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

Tri*_*daz 65 python django django-models

我正在编写一个脚本,将一些模型对象导入我的django应用程序使用的数据库中.在过去,我通过运行./manage.py shell然后解决了这个问题import myscript.我相信有更好的方法.我希望能够从我的HD上的任何地方调用脚本python scriptname.py,并且在该脚本的前几行中它将执行任何必要的导入/其他操作,以便它可以访问模型对象并且表现得好像它已经运行使用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)
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 128

从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..
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

示例型号:

class Location(models.Model):
    name = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

  • 只有在我将os.environ.setdefault("DJANGO_SETTINGS_MODULE","your_project_name.settings")移到导入操作系统后的行后,这才对我有用.否则,这是一个更好的解决方案. (4认同)
  • 这确实是现在所做的,并且可以完美地工作。 (2认同)

Reb*_*ebs 102

为了让模型加载,我不得不将这个与这个答案结合起来,否则我会得到django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
import django
django.setup()
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

然后我可以这样做:

from <app> import setup
setup()
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,显然它需要调用setup(),因为**Django 1.7**. (6认同)

DrT*_*rsa 36

我认为最好的方法是创建自定义管理命令.然后你可以manage.py <yourcommand>从任何地方打电话.

  • 从长远来看,这是更好的选择. (4认同)
  • 虽然如此,但有时仍需要使用其他脚本的django模型. (2认同)

Alk*_*dus 26

对于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
Run Code Online (Sandbox Code Playgroud)

所以你可以使用对象作为相同的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()
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用!姜戈 2.0。为什么我们需要在我们的项目目录中附加路径?关于 django.setup() 的高级功能有什么好的信息吗? (3认同)

Mel*_*lug 22

您需要先设置django环境:

from your_project import settings
from django.core.management import setup_environ
setup_environ(settings)
Run Code Online (Sandbox Code Playgroud)

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

  • 自Django 1.4以来,不推荐使用`setup_environ(settings)`!我在下面的帖子显示了另一个例子. (27认同)

Hen*_*huy 6

对于DJANGO 1.11

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

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

对我来说,这里的解决方案:

import os
from django.core.wsgi import get_wsgi_application

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)