tutorial - href django
django: la mejor forma de obtener el modelo de una instancia de ese modelo (2)
Digamos que my_instance
es del modelo MyModel
.
Estoy buscando una buena manera de hacerlo:
my_model = get_model_for_instance(my_instance)
No he encontrado ninguna manera realmente directa de hacer esto. Hasta ahora he llegado a esto:
from django.db.models import get_model
my_model = get_model(my_instance._meta.app_label, my_instance.__class__.__name__)
¿Es esto aceptable? ¿Es incluso una forma segura de hacer las mejores prácticas para hacerlo?
También hay _meta.object_name
que parece entregar lo mismo que __class__.__name__
. ¿Lo hace? Es mejor o peor? Si es así, ¿por qué?
Además, ¿cómo sé que obtengo el modelo correcto si la etiqueta de la aplicación aparece varias veces dentro del alcance del proyecto, por ejemplo, ''auth'' de ''django.contrib.auth'' y que también haya ''myproject.auth''?
¿Un caso como este haría que get_model
no get_model
confiable?
Gracias por cualquier sugerencia / punteros y compartir la experiencia!
my_new_instance = type(my_instance)()
my_model = type(my_instance)
Para probarlo, puedes crear otra instancia:
my_new_instance = type(my_instance)()
Es por eso que no hay una forma directa de hacerlo, porque los objetos python ya tienen esta característica.
actualizado...
Me gustó la respuesta de Marcinn que usa el type(x)
. Esto es idéntico a lo que usó la respuesta original ( x.__class__
), pero prefiero usar funciones que acceder a attribus mágicos. De esta manera, prefiero usar vars(x)
a x.__dict__
, len(x)
a x.__len__
y así sucesivamente.
actualizado 2 ...
Para instancias diferidas (mencionadas por @Cerin en comentarios) puede acceder a la clase original a través de instance._meta.proxy_for_model
.