如何在Django应用中编写Python脚本以访问模型,而不使用manage.py shell?

90 投票
13 回答
74125 浏览
提问于 2025-04-17 05:50

我正在写一个脚本,用来把一些模型对象导入到我Django应用使用的数据库中。以前我都是通过运行 ./manage.py shell 然后 import myscript 来解决这个问题。我觉得应该有更好的方法。我希望能从我电脑上的任何地方调用一个脚本,使用 python scriptname.py,并且在这个脚本的前几行里做一些必要的导入和其他操作,这样它就能访问模型对象,表现得就像是通过 manage.py shell 运行的一样。

我需要在我的脚本中添加什么才能实现这个目标呢?

编辑:

根据 @Melug 的回答,增加动态设置Python路径来解决“在我电脑上的任何地方”的问题:

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

13 个回答

142

为了让模型也能加载,我需要把这个和这个答案结合起来,不然我会遇到错误: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()
157

从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)
24

你首先需要设置好Django环境:

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

最后,导入你的模型,其他的就和Django一样操作了。

撰写回答