Подтвердить что ты не робот

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__. Имеет ли это? Лучше или хуже? Если да, то почему?

Также, как я узнаю, что получаю правильную модель, если метка приложения несколько раз входит в объем проекта, например. 'auth' из 'django.contrib.auth' и пусть также будет 'myproject.auth'?
Может ли такой случай сделать get_model ненадежным?

Спасибо за любые подсказки/указатели и обмен опытом!

4b9b3361

Ответ 1

my_model = type(my_instance)

Чтобы доказать это, вы можете создать другой экземпляр:

my_new_instance = type(my_instance)()

Вот почему нет прямого способа сделать это, потому что объекты python уже имеют эту функцию.

обновляется...

Мне понравился ответ marcinn, который использует type(x). Это идентично используемому исходному ответу (x.__class__), но я предпочитаю использовать функции для доступа к магическим атрибутам. Таким образом, я предпочитаю использовать vars(x) до x.__dict__, len(x) до x.__len__ и т.д.

обновлено 2...

Для отложенных экземпляров (упомянутых @Cerin в комментариях) вы можете получить доступ к исходному классу через instance._meta.proxy_for_model.

Ответ 2

my_new_instance = type(my_instance)()