In Django, c'è un posto in cui posso ottenere un elenco o cercare i modelli di cui l'ORM conosce?
Risposte:
Soluzione semplice:
import django.apps
django.apps.apps.get_models()
Per impostazione predefinita apps.get_models()
, non includere
Se vuoi includere anche questi,
django.apps.apps.get_models(include_auto_created=True, include_swapped=True)
Prima di Django 1.7, usa invece:
from django.db import models
models.get_models(include_auto_created=True)
Il include_auto_created
parametro assicura che ManyToManyField
vengano recuperate anche le tabelle create implicitamente da s.
from django.apps.apps import get_models
produce ImportError: No module named 'django.apps.apps'
... qualche idea?
from django.apps import apps
>>apps.get_models
Elenca i modelli utilizzando 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())
Se vuoi giocare e non usare la buona soluzione , puoi giocare un po 'con l'introspezione di 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
Nota: questo è un pezzo di codice piuttosto approssimativo; assumerà che tutti i modelli siano definiti in "models.py" e che ereditino da django.db.models.Model.
Se utilizzi l'app contenttypes, è semplice: http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/
Se registri i tuoi modelli con l'app di amministrazione, puoi vedere tutti gli attributi di queste classi nella documentazione dell'amministratore.
Ecco un modo semplice per trovare ed eliminare tutte le autorizzazioni esistenti nel database ma non presenti nelle definizioni del modello 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))