복붙노트

[PYTHON] 어떻게 장고 모델 클래스를 동적으로 검색합니까?

PYTHON

어떻게 장고 모델 클래스를 동적으로 검색합니까?

Django 모델의 전체 모듈 경로가 없어도 다음과 같은 작업을 수행 할 수 있습니까?

model = 'User' [in Django namespace]
model.objects.all()

... 반대로 :

User.objects.all().

편집 : 명령 줄 입력을 기반으로이 호출을 만들려고합니다. 가져 오기 문을 피할 수 있습니까 (예 :

model = django.authx.models.User

Django가 오류를 반환하지 않으면 :

"global name django is not defined."

해결법

  1. ==============================

    1.나는 당신이 이것을 찾고 있다고 생각합니다 :

    나는 당신이 이것을 찾고 있다고 생각합니다 :

    from django.db.models.loading import get_model
    model = get_model('app_name', 'model_name')
    

    물론 다른 방법이 있지만 네임 스페이스로 가져올 파일이 무엇인지 모르는 경우이를 처리하는 방법입니다. (실제로 모든 앱의 모델을 반복 할 때 행운을 시험해보고 싶다면 load.py의 소스 코드를 살펴보십시오.)

    업데이트 : Django의 비추천 타임 라인에 따르면 django.db.models.loading은 Django 1.7에서 사용되지 않으며 Django 1.9에서 제거됩니다. Alasdair의 답변에서 지적한 것처럼 동적으로 모델을로드하기위한 새로운 API가 Django 1.7에 추가되었습니다.

  2. ==============================

    2.Django 1.7+에는 응용 프로그램 레지스트리가 있습니다. apps.get_model 메소드를 사용하여 모델을 동적으로 가져올 수 있습니다.

    Django 1.7+에는 응용 프로그램 레지스트리가 있습니다. apps.get_model 메소드를 사용하여 모델을 동적으로 가져올 수 있습니다.

    from django.apps import apps
    MyModel = apps.get_model('app_label', 'MyModel')
    
  3. ==============================

    3.

    from django.authx.models import User
    model = User
    model.objects.all()
    
  4. ==============================

    4.장고는 오류를 반환하지 않습니다. 파이썬은 그렇다.

    장고는 오류를 반환하지 않습니다. 파이썬은 그렇다.

    먼저 모델을 가져와야합니다. 다음과 함께 가져와야합니다.

    from django.authx.models import User
    

    둘째, django가 정의되지 않았다는 오류가 발생하면 Django가 올바르게 설치되지 않습니다. 장고를 PYTHONPATH에 설치하거나 Python lib / site-packages에 설치해야합니다.

    Django를 올바르게 설치하려면 http://docs.djangoproject.com/en/dev/intro/install/#intro-install을 참조하십시오.

  5. ==============================

    5.클래스는 파이썬에서 "퍼스트 클래스"객체입니다. 즉, 다른 모든 객체처럼 전달되고 조작 될 수 있습니다.

    클래스는 파이썬에서 "퍼스트 클래스"객체입니다. 즉, 다른 모든 객체처럼 전달되고 조작 될 수 있습니다.

    모델은 클래스입니다. 클래스 문을 사용하여 새 모델을 작성한다는 사실을 알 수 있습니다.

    class Person(models.Model):
        last_name = models.CharField(max_length=64)
    
    class AnthropomorphicBear(models.Model):
        last_name = models.CharField(max_length=64)
    

    Person과 AnthropomorphicBear 식별자는 Django 클래스에 바인딩되어 있으므로 전달할 수 있습니다. 이는 모델 수준에서 작동하고 (공통 인터페이스를 공유하는) 도우미 함수를 작성하려는 경우 유용 할 수 있습니다.

    def print_obj_by_last_name(model, last_name):
        model_name = model.__name__
        matches = model.objects.filter(last_name=last_name).all()
        print('{0}: {1!r}'.format(model_name, matches))
    

    따라서 print_obj_by_last_name은 Person 또는 AnthropomorphicBear 모델과 함께 작동합니다. 다음과 같이 모델을 전달하십시오.

    print_obj_by_last_name(model=Person, last_name='Dole')
    print_obj_by_last_name(model=AnthropomorphicBear, last_name='Fozzy')
    
  6. ==============================

    6.모델 이름을 문자열로 전달한 경우 한 가지 방법이 될 수 있습니다.

    모델 이름을 문자열로 전달한 경우 한 가지 방법이 될 수 있습니다.

    modelname = "User"
    model = globals()[modelname]
    

    그러나 globals ()를 사용하면 어떤 경우에는 약간 위험 할 수 있습니다. 따라서주의해서 처리하십시오 :)

  7. from https://stackoverflow.com/questions/411810/how-do-i-retrieve-a-django-model-class-dynamically by cc-by-sa and MIT license