Ở Django, có nơi nào tôi có thể lấy danh sách hoặc tra cứu các mô hình mà ORM biết không?
Ở Django, có nơi nào tôi có thể lấy danh sách hoặc tra cứu các mô hình mà ORM biết không?
Câu trả lời:
Giải pháp đơn giản:
import django.apps
django.apps.apps.get_models()
Theo mặc định apps.get_models()
không bao gồm
Nếu bạn cũng muốn bao gồm những điều này,
django.apps.apps.get_models(include_auto_created=True, include_swapped=True)
Trước Django 1.7, thay vào đó hãy sử dụng:
from django.db import models
models.get_models(include_auto_created=True)
Các include_auto_created
Đảm bảo thông số mà thông qua các bảng ngầm tạo ra bởi ManyToManyField
s sẽ được lấy ra là tốt.
from django.apps.apps import get_models
sản xuất ImportError: No module named 'django.apps.apps'
... bất kỳ ý tưởng?
from django.apps import apps
>>apps.get_models
Liệt kê các mô hình sử dụng 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())
Nếu bạn muốn chơi và không sử dụng giải pháp tốt , bạn có thể chơi một chút với phần nội quan của 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
Lưu ý: đây là một đoạn mã khá thô; nó sẽ giả định rằng tất cả các mô hình được định nghĩa trong "models.py" và chúng kế thừa từ django.db.models.Model.
Nếu bạn sử dụng ứng dụng contenttypes thì thật đơn giản: http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/
Nếu bạn đăng ký mô hình của mình bằng ứng dụng quản trị, bạn có thể xem tất cả các thuộc tính của các lớp này trong tài liệu quản trị.
Đây là một cách đơn giản để tìm và xóa bất kỳ quyền nào tồn tại trong cơ sở dữ liệu nhưng không tồn tại trong định nghĩa mô hình 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))