update queryset query not equal cual consultas avanzadas python django django-models django-queryset

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()