django : 해당 모델의 인스턴스에서 모델을 가져 오는 모범 사례 방법
my_instance
모델이라고 말합니다 MyModel
.
할 수있는 좋은 방법을 찾고 있습니다.
my_model = get_model_for_instance(my_instance)
이 작업을 수행하는 직접적인 방법을 찾지 못했습니다. 지금까지 나는 이것을 생각 해냈다.
from django.db.models import get_model
my_model = get_model(my_instance._meta.app_label, my_instance.__class__.__name__)
이것이 허용됩니까? 이를위한 확실한 모범 사례일까요?
또한이 _meta.object_name
같은 전달하기 위해 보인다 __class__.__name__
. 그렇습니까? 더 좋거나 나빠? 그렇다면 그 이유는 무엇입니까?
또한 앱 레이블이 프로젝트 범위 내에서 여러 번 발생하는 경우 올바른 모델을 얻고 있는지 어떻게 알 수 있습니까 (예 : 'django.contrib.auth'의 'auth'와 'myproject.auth').
그러한 경우가 get_model
신뢰할 수 없게 만들 까요?
힌트 / 포인터 및 경험 공유에 감사드립니다!
my_model = type(my_instance)
이를 증명하기 위해 다른 인스턴스를 만들 수 있습니다.
my_new_instance = type(my_instance)()
이것이 파이썬 객체가 이미이 기능을 가지고 있기 때문에 직접적인 방법이없는 이유입니다.
업데이트 ...
을 사용 하는 marcinn의 응답 을 좋아했습니다 type(x)
. 이것은 원래의 대답 ( x.__class__
) 과 동일 하지만 마법 속성에 액세스하는 것보다 함수를 사용하는 것을 선호합니다. 이런 식으로 vars(x)
to x.__dict__
, len(x)
to x.__len__
등을 사용 하는 것을 선호 합니다.
업데이트 2 ...
지연된 인스턴스 (@Cerin이 주석에서 언급 함)의 경우를 통해 원래 클래스에 액세스 할 수 있습니다 instance._meta.proxy_for_model
.
my_new_instance = type(my_instance)()
적어도 Django 1.11에서는 작동합니다 (지연된 인스턴스에서도 작동합니다).
def get_model_for_instance(instance):
return instance._meta.model
여기에 소스 .
'Development Tip' 카테고리의 다른 글
npm install 명령으로 .bat 파일 만들기 (0) | 2021.01.06 |
---|---|
SQL에서 "리터럴"테이블을 정의 할 수 있습니까? (0) | 2021.01.06 |
DataGridView 컨트롤에서 선택한 모든 행을 선택 취소하는 방법은 무엇입니까? (0) | 2021.01.06 |
면도기로 다른 경우 속기 (0) | 2021.01.06 |
Android Java-Joda Date가 느립니다. (0) | 2021.01.06 |