Development Tip

django : 해당 모델의 인스턴스에서 모델을 가져 오는 모범 사례 방법

yourdevel 2021. 1. 6. 20:31
반응형

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

여기에 소스 .

참조 URL : https://stackoverflow.com/questions/2064480/django-best-practice-way-to-get-model-from-an-instance-of-that-model

반응형