2010-04-30 13 views
22

que tienen un modelo con una relación genérica:¿Cómo obtener la aplicación de un modelo de Django?

TrackedItem --- genericrelation ---> any model 

Me gustaría ser capaz de obtener de forma genérica, a partir del modelo inicial, el elemento rastreado.

Debería poder hacerlo en cualquier modelo sin modificarlo.

Para hacer eso necesito obtener el tipo de contenido y la identificación del objeto. Obtener el ID del objeto es fácil ya que tengo la instancia del modelo, pero obtener el tipo de contenido no es: ContentType.object.filter requiere el modelo (que es solo content_object.__class__.__name__) y la etiqueta app_.

No tengo idea de cómo obtener de manera confiable la aplicación en la que se encuentra el modelo.

Por ahora hago app = content_object.__module__.split(".")[0], pero no funciona con las aplicaciones django contrib.

Respuesta

28

No es necesario para obtener la aplicación o modelo sólo para obtener el contenttype - hay un método práctico para hacer precisamente eso:

ContentType.objects.get_for_model(myobject) 

A pesar del nombre, funciona tanto para las clases del modelo e instancias.

+3

Esta es una mejor solución que usar _meta. – Wogan

+8

¿Lo es? ¿Esto no afecta la base de datos? – meshy

+1

@meshy yes pero django ContentType usa un caché en su administrador, por lo que solo consulta una vez por modelo. – dalore

75

El app_label está disponible como un atributo en el atributo _meta de cualquier modelo.

from django.contrib.auth.models import User 
print User._meta.app_label 
# The object name is also available 
print User._meta.object_name 
0

, usted puede obtener tanto app_label y model de su objeto utilizando el incorporado en ContentType clase

from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth.models import User 

user_obj = User.objects.create() 
obj_content_type = ContentType.objects.get_for_model(user_obj) 

print(obj_content_type.app_label) 
# u'auth' 
print(obj_content_type.model) 
# u'user' 

Este es un mejor enfoque respecto de la utilización de los _meta propiedades que se definen como privado.

Cuestiones relacionadas