Dans Django, vous pouvez spécifier des relations telles que:
author = ForeignKey('Person')
Et puis en interne, il doit convertir la chaîne "Person" dans le modèle Person
.
Où est la fonction qui fait cela? Je veux l'utiliser, mais je ne le trouve pas.
django
django-models
mpen
la source
la source
from django.apps import AppConfig
django.apps.apps.get_model(model_name)
. Les objets AppConfig sont destinés à un objectif différent et vous obligent à créer une instance AppConfig pour pouvoir appelerget_model()
.django.db.models.loading
a été déconseillé dans Django 1.7 ( supprimé dans 1.9 ) au profit du nouveau système de chargement d'application .La documentation Django 1.7 nous donne plutôt ce qui suit:
la source
juste pour tous ceux qui restent coincés (comme moi):
app_name
doit être répertorié avec des guillemets, comme il se doitmodel_name
(c'est-à-dire n'essayez pas de l'importer)get_model
accepte les minuscules ou les majuscules 'model_name'la source
La plupart des "chaînes" de modèle apparaissent sous la forme "appname.modelname", vous pouvez donc utiliser cette variante sur get_model
La partie du code django qui transforme généralement ces chaînes en un modèle est un peu plus complexe à partir de
django/db/models/fields/related.py
:Pour moi, cela semble être un bon cas pour diviser cela en une seule fonction dans le code de base. Cependant, si vous savez que vos chaînes sont au format «App.Model», les deux lignes ci-dessus fonctionneront.
la source
your_model = get_model(*your_string.rsplit('.', 1))
. L'étiquette d'application est parfois au format pointillé, mais le nom du modèle est toujours un identifiant valide.apps.get_model
. "En tant que raccourci, cette méthode accepte également un seul argument dans le formulaireapp_label.model_name
."La meilleure façon de faire cela dans Django 1.7+ est:
Donc, dans l'exemple canonique de tous les tutoriels de framework:
la source
Si vous ne savez pas dans quelle application votre modèle existe, vous pouvez le rechercher de cette façon:
N'oubliez pas que votre_nom_modèle doit être en minuscules.
la source
Je ne sais pas où c'est fait dans Django, mais vous pouvez le faire.
Mappage du nom de la classe sur la chaîne via la réflexion.
la source
Un autre rendu avec moins de code pour les paresseux. Testé dans Django 2+
la source
Voici une approche moins spécifique à django pour obtenir une classe à partir de string:
ou vous pouvez utiliser importlib comme indiqué ici :
la source
Solution 2020:
par exemple:
per: Erreur d'importation: impossible d'importer le nom get_model
la source