Di Django, adakah tempat saya bisa mendapatkan daftar atau mencari model yang diketahui ORM?
Jawaban:
Solusi sederhana:
import django.apps
django.apps.apps.get_models()
Secara default apps.get_models()
tidak termasuk
Jika Anda ingin memasukkan ini juga,
django.apps.apps.get_models(include_auto_created=True, include_swapped=True)
Sebelum Django 1.7, gunakan:
from django.db import models
models.get_models(include_auto_created=True)
The include_auto_created
Memastikan parameter yang melalui tabel secara implisit dibuat oleh ManyToManyField
s akan diambil juga.
from django.apps.apps import get_models
menghasilkan ImportError: No module named 'django.apps.apps'
... ada ide?
from django.apps import apps
>>apps.get_models
Buat daftar model menggunakan 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())
Jika Anda ingin bermain, dan tidak menggunakan solusi yang baik , Anda dapat bermain sedikit dengan introspeksi 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
Catatan: ini adalah kode yang cukup kasar; ini akan mengasumsikan bahwa semua model didefinisikan dalam "models.py" dan model tersebut diturunkan dari django.db.models.Model.
Jika Anda menggunakan aplikasi contenttypes, maka langsung saja: http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/
Jika Anda mendaftarkan model Anda dengan aplikasi admin, Anda dapat melihat semua atribut kelas ini di dokumentasi admin.
Berikut cara sederhana untuk menemukan dan menghapus izin yang ada di database tetapi tidak ada dalam definisi model 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))