Programing

manage.py 셸을 사용하지 않고 모델 객체에 액세스하는 Django 스크립트

lottogame 2020. 11. 19. 07:46
반응형

manage.py 셸을 사용하지 않고 모델 객체에 액세스하는 Django 스크립트


내 django 응용 프로그램이 사용하는 데이터베이스로 일부 모델 개체를 가져 오는 스크립트를 작성 중입니다. 과거에 나는 실행하여이 문제를 해결 한 ./manage.py shell다음과 import myscript. 더 나은 방법이 있다고 확신합니다. 를 사용하여 HD의 어느 곳에서나 스크립트를 호출 할 수 있기를 원하며 해당 스크립트 python scriptname.py의 처음 몇 줄에서 필요한 모든 가져 오기 / 기타 작업을 수행하여 모델 개체에 액세스하고 실행 된 것처럼 동작 할 수 있습니다. 사용 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)

먼저 django 환경을 설정해야합니다.

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

마침내 모델을 가져 오면 모든 것이 장고처럼 진행됩니다.


Django 1.4부터는 setup_environ(settings)더 이상 사용되지 않으므로 (post by 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장고 프로젝트에 이것을 추가 하면 앱 이름이 자동으로 검색되므로 복사 / 붙여 넣기가 가능합니다.

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 용

Upper solutions did not work, but gave me an error:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

For me solution from here worked out:

import os
from django.core.wsgi import get_wsgi_application

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
application = get_wsgi_application()

Here is the answer for Django versions > 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)

Since at least Django 1.11, your main app includes a wsgi module that does the neccessary setup on import. Assuming myproject/myproject is where your settings.py is, in your script just import:

from myproject.wsgi import application

If you get:

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

Try:

import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')
application = get_wsgi_application()

Try:

os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"

if os.environ.setdefault doesn't work. (Windows 10, python3.6.4, django 2.0.3)


As Stavros pointed out here, you can just copy the wsgi.py and put it at the beginning of you script. Besides setting up DJANGO_SETTINGS_MODULE, you also need to get the applications. Hope it helps. It works for me at 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()

참고URL : https://stackoverflow.com/questions/8047204/django-script-to-access-model-objects-without-using-manage-py-shell

반응형