Django: Làm cách nào tôi có thể tìm thấy danh sách các mô hình mà ORM biết?


Câu trả lời:


174

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

  • các mô hình được tạo tự động cho các quan hệ nhiều-nhiều mà không có bảng trung gian rõ ràng
  • mô hình đã được hoán đổi.

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 ManyToManyFields sẽ được lấy ra là tốt.


2
Sử dụng phương pháp tương tự bạn cũng có thể nhận được tất cả các mô hình chỉ trong một ứng dụng: stackoverflow.com/a/8702854/117268
Emil Stenström

from django.apps.apps import get_modelssản xuất ImportError: No module named 'django.apps.apps'... bất kỳ ý tưởng?
aljabear

3
from django.apps import apps>>apps.get_models
Dingo


6

Nếu bạn muốn có một từ điển với tất cả các kiểu máy, bạn có thể sử dụng:

from django.apps import apps

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

4

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.



0

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ị.


0

Đâ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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.