Django: Wie finde ich eine Liste von Modellen, die der ORM kennt?

85

Gibt es in Django einen Ort, an dem ich eine Liste der Modelle abrufen oder nachschlagen kann, über die das ORM Bescheid weiß?

Interstar
quelle

Antworten:

171

Einfache Lösung:

import django.apps
django.apps.apps.get_models()

Standardmäßig apps.get_models()nicht einschließen

  • automatisch erstellte Modelle für Viele-zu-Viele-Beziehungen ohne explizite Zwischentabelle
  • Modelle, die ausgetauscht wurden.

Wenn Sie diese ebenfalls einbeziehen möchten,

django.apps.apps.get_models(include_auto_created=True, include_swapped=True)

Verwenden Sie vor Django 1.7 stattdessen:

from django.db import models
models.get_models(include_auto_created=True)

Der include_auto_createdParameter stellt sicher, dass durch Tabellen, die implizit von ManyToManyFields erstellt wurden, auch Daten abgerufen werden.

Daniel Roseman
quelle
2
Mit der gleichen Methode können Sie auch alle Modelle in nur einer App erhalten: stackoverflow.com/a/8702854/117268
Emil Stenström
from django.apps.apps import get_modelsproduziert ImportError: No module named 'django.apps.apps'... irgendeine Idee?
Aljabear
3
from django.apps import apps>>apps.get_models
Dingo
6

Wenn Sie ein Wörterbuch mit allen Modellen möchten, können Sie Folgendes verwenden:

from django.apps import apps

models = {
    model.__name__: model for model in apps.get_models()
}
Myzel394
quelle
4

Wenn Sie spielen möchten und nicht die gute Lösung verwenden möchten , können Sie ein wenig mit Python-Introspektion spielen:

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

Hinweis: Dies ist ein ziemlich grober Code. Es wird davon ausgegangen, dass alle Modelle in "models.py" definiert sind und von django.db.models.Model erben.

rauben
quelle
0

Wenn Sie Ihre Modelle bei der Admin-App registrieren, sehen Sie alle Attribute dieser Klassen in der Admin-Dokumentation.

Technischer Barde
quelle
0

Hier ist eine einfache Möglichkeit, Berechtigungen zu finden und zu löschen, die in der Datenbank vorhanden sind, aber in den ORM-Modelldefinitionen nicht vorhanden sind:

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))
Aidan
quelle