Скрипт Django для доступа к объектам модели без использования manage.py оболочка
Я пишу скрипт для импорта некоторых объектов модели в базу данных, которую использует мое приложение django. В прошлом я решил это, запустив ./manage.py shell а то import myscript. Я уверен, что есть лучший путь. Я хотел бы иметь возможность вызывать скрипт из любого места на моем HD с помощью python scriptname.py, и в первых нескольких строках этого скрипта он будет делать все необходимые операции импорта / другие операции, чтобы он мог получить доступ к объектам модели и вести себя так, как если бы он был запущен с помощью manage.py shell.
что мне нужно чтобы добавить в мой скрипт для достижения этой цели?
EDIT:
на основе ответа @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)
10 ответов:
сначала нужно настроить среду 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, 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)
чтобы загрузить модели тоже, мне пришлось объединить это с ответ, иначе я вам
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yetimport os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings") import django django.setup()в качестве дополнительного, я добавляю это к
__init__.pyиз моих проектов django он автоматически обнаружит имя приложения, поэтому он может копировать / вставлять: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()
Я думаю, что лучший способ-это создать свой пользовательские команды управления(с). Тогда вы можете позвонить
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
верхние решения не работали, но дали мне ошибку:
Джанго.ядро.исключения.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)
поскольку, по крайней мере, Django 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()
попробуй:
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"Если
os.environ.setdefaultне работает. (Windows 10, python3. 6. 4, django 2.0.3)
Comments