python - queryset - django shell
¿Cómo recupero dinámicamente una clase de modelo de Django? (6)
Sin tener la ruta de módulo completa de un modelo de Django, ¿es posible hacer algo como esto?
model = ''User'' [in Django namespace]
model.objects.all()
...Opuesto a:
User.objects.all().
EDITAR: Estoy tratando de hacer esta llamada en función de la entrada de la línea de comandos. ¿Es posible evitar la declaración de importación, por ejemplo,
model = django.authx.models.User
Sin Django devolviendo el error:
"global name django is not defined."
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, DEBE importar el modelo. Debe importarlo con
from django.authx.models import User
En segundo lugar, si obtiene un error que django
no está definido, entonces Django no está instalado correctamente. Debe tener Django en su PYTHONPATH
o instalarlo en sus libs / site-packages de Python.
Para instalar Django correctamente, consulte http://docs.djangoproject.com/en/dev/intro/install/#intro-install
Creo que estás 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é archivo de modelos necesita importar en su espacio de nombres. (Tenga en cuenta que realmente no hay forma de obtener un modelo de forma segura sin saber a qué aplicación pertenece. Mire el código fuente para cargar.py si desea probar su suerte al iterar sobre todos los modelos de las aplicaciones).
Actualización: de acuerdo con la línea de tiempo de desaprobación de Django, django.db.models.loading
ha quedado obsoleto en Django 1.7 y se eliminará en Django 1.9. Como se señala en la respuesta de Alasdair , se agregó una nueva API para cargar dinámicamente modelos a Django 1.7.
Las clases son objetos de "primera clase" en Python, lo que significa que pueden pasarse y manipularse como cualquier otro objeto.
Los modelos son clases: se puede deducir del hecho de que se crean nuevos modelos usando declaraciones de clases:
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 por alto. Esto puede ser útil si desea crear funciones auxiliares 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))
Entonces print_obj_by_last_name
funcionará con los modelos Person
o AnthropomorphicBear
. Simplemente pasa el modelo así:
print_obj_by_last_name(model=Person, last_name=''Dole'')
print_obj_by_last_name(model=AnthropomorphicBear, last_name=''Fozzy'')
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'')
Si tiene el nombre del modelo pasado como una cadena, supongo que una forma podría ser
modelname = "User"
model = globals()[modelname]
Pero andar con global () puede ser un poco peligroso en algunos contextos. Así que maneje con cuidado :)
from django.authx.models import User
model = User
model.objects.all()