Скрипт 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)
1072   10  

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 yet

import 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

    Ничего не найдено.