Dans Django, y a-t-il un endroit où je peux obtenir une liste ou rechercher les modèles que l'ORM connaît?
Réponses:
Solution simple:
import django.apps
django.apps.apps.get_models()
Par défaut, apps.get_models()
ne pas inclure
Si vous souhaitez les inclure également,
django.apps.apps.get_models(include_auto_created=True, include_swapped=True)
Avant Django 1.7, utilisez à la place:
from django.db import models
models.get_models(include_auto_created=True)
Le include_auto_created
paramètre garantit que les tables créées implicitement par ManyToManyField
s seront également récupérées.
from django.apps.apps import get_models
produit ImportError: No module named 'django.apps.apps'
... une idée?
from django.apps import apps
>>apps.get_models
Liste des 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, et ne pas utiliser la bonne solution , vous pouvez jouer un peu avec l'introspection 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: il s'agit d'un morceau de code assez grossier; il 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, c'est simple: http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/
Si vous enregistrez vos modèles avec l'application d'administration, vous pouvez voir tous les attributs de ces classes dans la documentation d'administration.
Voici un moyen simple de rechercher et de supprimer toutes les autorisations qui existent dans la base de données mais qui n'existent pas 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))