¿Cómo recupero dinámicamente una clase de modelo Django?

Sin tener la ruta de módulo completa de un modelo de Django, es posible hacer algo como:

model = 'User' [in Django namespace] model.objects.all() 

…Opuesto a:

 User.objects.all(). 

EDITAR: Estoy tratando de hacer esta llamada basada en la entrada de línea de comandos. ¿Es posible evitar la statement de importación, por ejemplo,

 model = django.authx.models.User 

Sin Django devolviendo el error:

 "global name django is not defined." 

Creo que estas buscando esto:

 from django.db.models.loading import get_model model = get_model('app_name', 'model_name') 

Hay otros métodos, por supuesto, pero esta es la forma en que lo manejaría si no sabe qué modelos de archivos necesita importar en su espacio de nombres. (Tenga en cuenta que realmente no hay manera de obtener un modelo de forma segura sin saber primero a qué aplicación pertenece. Mire el código fuente de loading.py si desea probar su suerte en la iteración de todos los modelos de aplicaciones).

Actualización: De acuerdo con la línea de tiempo de django.db.models.loading Django, django.db.models.loading ha quedado en desuso en Django 1.7 y se eliminará en Django 1.9. Como se señaló en la respuesta de Alasdair , se agregó una nueva API para cargar dinámicamente modelos a Django 1.7.

Para Django 1.7+, hay un registro de aplicaciones . Puede usar el método apps.get_model para obtener dinámicamente un modelo.

 from django.apps import apps MyModel = apps.get_model('app_label', 'MyModel') 
 from django.authx.models import User model = User model.objects.all() 

model = django.authx.models.User

? Django devuelve un error, “el nombre global django no está definido”.

Django no devuelve el error. Python lo hace.

Primero, DEBES importar el modelo. Debes importarlo con

 from django.authx.models import User 

Segundo, si obtienes un error de que django no está definido, entonces Django no está instalado correctamente. Debe tener Django en su PYTHONPATH o instalado en sus paquetes / lib de Python.

Para instalar Django correctamente, consulte http://docs.djangoproject.com/en/dev/intro/install/#intro-install

Las clases son objetos de “primera clase” en Python, lo que significa que pueden transmitirse y manipularse como todos los demás objetos.

Los modelos son clases; puede darse cuenta del hecho de que crea nuevos modelos utilizando declaraciones de clase:

 class Person(models.Model): last_name = models.CharField(max_length=64) class AnthropomorphicBear(models.Model): last_name = models.CharField(max_length=64) 

Los identificadores Person y AnthropomorphicBear están vinculados a las clases de Django, por lo que puede pasarlos. Esto puede ser útil si desea crear funciones de ayuda que funcionen a nivel de modelo (y compartan una interfaz común):

 def print_obj_by_last_name(model, last_name): model_name = model.__name__ matches = model.objects.filter(last_name=last_name).all() print('{0}: {1!r}'.format(model_name, matches)) 

Por print_obj_by_last_name tanto, print_obj_by_last_name funcionará con los modelos Person o AnthropomorphicBear . Solo pasa el modelo de esta manera:

 print_obj_by_last_name(model=Person, last_name='Dole') print_obj_by_last_name(model=AnthropomorphicBear, last_name='Fozzy') 

Si tiene el nombre del modelo pasado como una cadena, supongo que una forma podría ser

 modelname = "User" model = globals()[modelname] 

Pero andar por ahí con globals () puede ser un poco peligroso en algunos contextos. Así que maneja con cuidado 🙂