Dans Django, y a-t-il un endroit où je peux obtenir une liste ou rechercher les modèles que l'ORM connaît?
django
django-models
interstar
la source
la source
from django.apps.apps import get_models
produitImportError: 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())
la source
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() }
la source
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.
la source
Si vous utilisez l'application contenttypes, c'est simple: http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/
la source
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.
la source
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))
la source