如何在Django应用中编写Python脚本以访问模型,而不使用manage.py shell?
我正在写一个脚本,用来把一些模型对象导入到我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一样操作了。