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)
您需要先设置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()