En Django, puede especificar relaciones como:
author = ForeignKey('Person')
Y luego internamente tiene que convertir la cadena "Persona" en el modelo Person
.
¿Dónde está la función que hace esto? Quiero usarlo, pero no puedo encontrarlo.
django
django-models
mpen
fuente
fuente
from django.apps import AppConfig
django.apps.apps.get_model(model_name)
. Los objetos AppConfig están destinados a un propósito diferente y requieren que cree una instancia de AppConfig para poder llamarget_model()
.django.db.models.loading
fue desaprobado en Django 1.7 ( eliminado en 1.9 ) a favor del nuevo sistema de carga de aplicaciones .Los documentos de Django 1.7 nos dan lo siguiente en su lugar:
fuente
solo para cualquiera que se quede atascado (como lo hice):
app_name
debe aparecer entre comillas, como deberíamodel_name
(es decir, no intente importarlo)get_model
acepta minúsculas o mayúsculas 'model_name'fuente
La mayoría de las "cadenas" del modelo aparecen como "appname.modelname", por lo que es posible que desee utilizar esta variación en get_model
La parte del código de Django que generalmente convierte tales cadenas en un modelo es un poco más compleja
django/db/models/fields/related.py
.Para mí, este parece ser un buen caso para dividir esto en una sola función en el código central. Sin embargo, si sabe que sus cadenas están en formato "App.Model", las dos líneas anteriores funcionarán.
fuente
your_model = get_model(*your_string.rsplit('.', 1))
. La etiqueta de la aplicación a veces tiene formato punteado, sin embargo, el nombre del modelo siempre es un identificador válido.apps.get_model
. "Como método abreviado, este método también acepta un único argumento en el formularioapp_label.model_name
".La forma bendecida de hacer esto en Django 1.7+ es:
Entonces, en el ejemplo canónico de todos los tutoriales de framework:
fuente
En caso de que no sepa en qué aplicación existe su modelo, puede buscarlo de esta manera:
Recuerde que your_model_name debe estar en minúsculas.
fuente
No estoy seguro de dónde se hace en Django, pero podrías hacer esto.
Asignación del nombre de la clase a la cadena mediante reflexión.
fuente
Otra versión con menos código para los perezosos. Probado en Django 2+
fuente
Aquí hay un enfoque menos específico de django para obtener una clase de una cadena:
o puede usar importlib como se muestra aquí :
fuente
Solución 2020:
por su por ejemplo:
por: Error de importación: no se puede importar el nombre get_model
fuente