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
ненадежным?
Спасибо за любые подсказки/указатели и обмен опытом!
Ответы
Ответ 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)()