我正在编写一个脚本,将一些模型对象导入我的django应用程序使用的数据库中。在过去,我通过运行./manage.py shell
然后import myscript
解决了这个问题。我相信有更好的方法。我希望能够使用python scriptname.py
从我的HD上的任何地方调用脚本,并且在该脚本的前几行中,它将执行任何必要的导入/其他操作,以便它可以访问模型对象和行为好像它是使用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)
答案 0 :(得分:120)
自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)
答案 1 :(得分:94)
要加载模型,我必须将其与this answer结合使用,否则我会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()
答案 2 :(得分:34)
我认为最好的方法是创建custom management command(s)。然后,您可以从任何地方拨打manage.py <yourcommand>
。
答案 3 :(得分:23)
对于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()
答案 4 :(得分:21)
您需要先设置django环境:
from your_project import settings
from django.core.management import setup_environ
setup_environ(settings)
最后导入你的模型,一切都像django。
答案 5 :(得分:5)
FOR DJANGO 1.11
上层解决方案不起作用,但给了我一个错误:
django.core.exceptions.AppRegistryNotReady:尚未加载应用。
对我来说,来自here的解决方案已经解决了:
import os
from django.core.wsgi import get_wsgi_application
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
application = get_wsgi_application()
答案 6 :(得分:2)
以下是Django版本的答案&gt; 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)
答案 7 :(得分:2)
至少从Django 1.11开始,你的主应用程序包含一个wsgi模块,可以在导入时进行必要的设置。假设myproject/myproject
是您的settings.py的位置,请在您的脚本中导入:
from myproject.wsgi import application
答案 8 :(得分:2)
对于django> = 2.0,足以完成这两次导入
from your_project_path import settings as your_project_settings
from django.core.management import settings
那么您只需from my_app.models import MyModel
并使用您的模型MyModel
答案 9 :(得分:0)
如果你得到:
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()
答案 10 :(得分:0)
尝试:
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
如果os.environ.setdefault
不起作用。 (Windows 10,python3.6.4,django 2.0.3)
答案 11 :(得分:0)
正如Stavros指出的here,您可以复制wsgi.py并将其放在脚本的开头。除了设置DJANGO_SETTINGS_MODULE,您还需要获取应用程序。希望能帮助到你。它在Django 2.1.5上对我有效。
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'revochem.settings')
application = get_wsgi_application()