73 votes

Django obtient la liste des modèles de l'application

J'ai donc un fichier models.py dans le dossier MyApp :

from django.db import models
class Model_One(models.Model):
    ...
class Model_Two(models.Model):
    ...
...

Il peut s'agir de 10 à 15 cours. Comment trouver tous les modèles dans la MyApp et obtenir leurs noms ?

Comme les modèles ne sont pas itérables, je ne sais pas si cela est possible.

6 votes

@downvoter, voulez-vous partager pourquoi vous avez rétrogradé ? Il n'y a rien de mal à cette question (+1 pour équilibrer).

1 votes

Je ne suis pas d'accord avec le downvote. Grep n'est pas adapté si vous voulez connaître les modèles au moment de l'exécution. Les fonctions get_app et get_models sont parfaites dans ce cas.

0 votes

"connaître les modèles au moment de l'exécution" ? Qu'est-ce que cela signifie ?

103voto

Sjoerd Points 34671

À partir de Django 1.7, vous pouvez utiliser ce code, par exemple dans votre admin.py pour enregistrer tous les modèles :

from django.apps import apps
from django.contrib import admin
from django.contrib.admin.sites import AlreadyRegistered

app_models = apps.get_app_config('my_app').get_models()
for model in app_models:
    try:
        admin.site.register(model)
    except AlreadyRegistered:
        pass

0 votes

Ne fonctionne pas sur django v2+.

94voto

juliomalegria Points 6281

UPDATE

pour les versions plus récentes de Django, vérifiez Sjoerd réponse ci-dessous

Réponse originale de 2012 : C'est la meilleure façon d'accomplir ce que vous voulez faire :

from django.db.models import get_app, get_models

app = get_app('my_application_name')
for model in get_models(app):
    # do something with the model

Dans cet exemple, model est le modèle réel, donc vous pouvez faire beaucoup de choses avec lui :

for model in get_models(app):
    new_object = model() # Create an instance of that model
    model.objects.filter(...) # Query the objects of that model
    model._meta.db_table # Get the name of the model in the database
    model._meta.verbose_name # Get a verbose name of the model
    # ...

13 votes

Depuis django 1.7, vous devez utiliser le nouveau système de chargement des applications : from django.apps import apps contenant ces méthodes. django.db.models.loading sera supprimé dans django 1.9.

0 votes

Je suis toujours en train d'utiliser django 1.6.x donc cette réponse m'est utile. Question : étant donné un modèle provenant de get_models, comment obtient-on le nom qui peut être ensuite passé dans get_model(app_name, model_name) ? J'en ai besoin parce que je veux obtenir la liste de tous les noms de modèles sous forme de chaînes de caractères à un endroit, et passer les noms à un autre morceau de code qui appelle ensuite get_model.

28voto

pedrotorres Points 108

La meilleure réponse que j'ai trouvée pour obtenir tous les modèles à partir d'une application :

from django.apps import apps
apps.all_models['<app_name>']  #returns dict with all models you defined

0 votes

Utilisez dict(apps.all_models['<app_name>']) si vous avez besoin de l'imprimer, autrement vous obtiendriez OrderedDict() comme réponse.

0 votes

@GiampaoloFerradini - Je reçois une liste du type {'materials': <class 'logis.models.Materials'>, ...} . Comment puis-je obtenir uniquement les noms des modèles (par exemple, Matériaux ) de la liste ?

0 votes

@user12379095 vous faites quelque chose comme e.g. for k in m_d: print(k) donde m_d est votre dictionnaire des modèles d'applications, que vous définissez comme `m_d = dict( apps.all_models['your_app_name']

3voto

gkr Points 389

Une alternative est d'utiliser Types de contenu .

Chaque modèle pour chaque application dans INSTALLED_APPS obtient une entrée dans les modèles ContentType. Cela vous permet, par exemple, d'avoir une clé étrangère à un modèle.

>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.filter(app_label="auth")
<QuerySet [<ContentType: group>, <ContentType: permission>, <ContentType: user>]>
>>> [ct.model_class() for ct in ContentType.objects.filter(app_label="auth")]
[<class 'django.contrib.auth.models.Group'>, <class 'django.contrib.auth.models.Permission'>, <class 'django.contrib.auth.models.User'>]

2voto

mgalgs Points 2203

Voici une solution rapide et simple, sans codage, utilisant dumpdata y jq :

python manage.py dumpdata oauth2_provider | jq -r '.[] | .model' | uniq

Vous pourriez également nettoyer le jq pour obtenir le format qui vous convient le mieux.


Bonus : vous pouvez voir le décompte des différents types d'objets en ajoutant l'option <code>-c</code> pour <code>uniq</code> .

0 votes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X