Dans Django, y a-t-il un endroit où je peux obtenir une liste ou consulter les modèles que l'ORM connaît?
Solution simple:
import Django.apps
Django.apps.apps.get_models()
Par défaut, apps.get_models()
n'inclut pas
Si vous souhaitez les inclure également,
Django.apps.apps.get_models(include_auto_created=True, include_swapped=True)
Avant Django 1.7, utilisez plutôt:
from Django.db import models
models.get_models(include_auto_created=True)
Le paramètre include_auto_created
garantit que les tables implicitement créées par ManyToManyField
s seront également récupérées.
Répertoriez les modèles à l'aide de http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/
from Django.contrib.contenttypes.models import ContentType
for ct in ContentType.objects.all():
m = ct.model_class()
print "%s.%s\t%d" % (m.__module__, m.__name__, m._default_manager.count())
Si vous voulez jouer sans utiliser la solution good , vous pouvez jouer un peu avec l'introspection de python:
import settings
from Django.db import models
for app in settings.INSTALLED_APPS:
models_name = app + ".models"
try:
models_module = __import__(models_name, fromlist=["models"])
attributes = dir(models_module)
for attr in attributes:
try:
attrib = models_module.__getattribute__(attr)
if issubclass(attrib, models.Model) and attrib.__module__== models_name:
print "%s.%s" % (models_name, attr)
except TypeError, e:
pass
except ImportError, e:
pass
Remarque: ceci est un morceau de code assez approximatif; cela supposera que tous les modèles sont définis dans "models.py" et qu'ils héritent de Django.db.models.Model.
Si vous utilisez l'application contenttypes, alors c'est simple: http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/
Si vous voulez un dictionnaire avec tous les modèles, vous pouvez utiliser:
from Django.apps import apps
models = {
model.__name__: model for model in apps.get_models()
}
Si vous enregistrez vos modèles avec l'application d'administration, vous pouvez voir tous les attributs de ces classes dans la documentation de l'administrateur.
Voici un moyen simple de rechercher et de supprimer les autorisations existantes dans la base de données mais non présentes dans les définitions de modèle ORM:
from Django.apps import apps
from Django.contrib.auth.management import _get_all_permissions
from Django.contrib.auth.models import Permission
from Django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **options):
builtins = []
for klass in apps.get_models():
for perm in _get_all_permissions(klass._meta):
builtins.append(perm[0])
builtins = set(builtins)
permissions = set(Permission.objects.all().values_list('codename', flat=True))
to_remove = permissions - builtins
res = Permission.objects.filter(codename__in=to_remove).delete()
self.stdout.write('Deleted records: ' + str(res))