Django脚本访问模型对象,而不使用manage.py shell

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

我需要添加到我的脚本来实现这一目标?

编辑:

根据@ Melug的回答,除了dynamic设置Pythonpath来解决“我的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) 

9 Solutions collect form web for “Django脚本访问模型对象,而不使用manage.py shell”

您需要先设置django环境:

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

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

从Django 1.4开始,你应该避免使用setup_environ(settings) (由Melug发布),因为它已经被弃用了。 使用下面的代替,你将能够访问你的模型

 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings") # your imports, eg Django models from your_project_name.models import Location # From now onwards start your script.. 

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

 if __name__ == '__main__': # eg 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 # eg delete the location berlin = Location.objects.filter(name='Berlin') print berlin berlin.delete() 

示例模型:

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

为了让模型也加载,我不得不把这个与这个答案 ,否则我得到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() 

我认为最好的方法是创build您的自定义pipe理命令 。 那么你可以从任何地方调用manage.py <yourcommand>你的manage.py <yourcommand>

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

对于DJANGO 1.11

上面的解决scheme没有工作,但给了我一个错误:

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

这里是Django版本> 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) 

由于至lessDjango 1.11,您的主要应用程序包括一个wsgi模块,进行必要的设置。 假设myproject/myproject是你的settings.py的地方,在你的脚本中只需导入:

 from myproject.wsgi import application 

如果你得到:

 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() 
  • debuggingApache / Django / WSGI错误请求(400)错误
  • “大数据”使用大pandas的工作stream程
  • Python中的float的二进制表示(位不是hex)
  • 是否有可能以完全相同的方式sorting两个列表(它们相互引用)?
  • Python有匿名类吗?
  • 在Python中从用户获取多个input
  • NumPy数组就地转换
  • Django开发IDE
  • 函数不改变全局variables
  • 从另一个函数调用一个函数内定义的variables
  • urllib2读取到Unicode