Django: मुझे उन मॉडलों की सूची कैसे मिल सकती है जिन्हें ORM जानता है?


86

Django में, क्या ऐसी कोई जगह है जहां मैं एक सूची प्राप्त कर सकता हूं या उन मॉडलों को देख सकता हूं जिनके बारे में ORM जानता है?

जवाबों:


174

सरल समाधान:

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

डिफ़ॉल्ट रूप से apps.get_models()शामिल नहीं है

  • एक स्पष्ट मध्यवर्ती तालिका के बिना कई-से-कई संबंधों के लिए ऑटो-निर्मित मॉडल
  • ऐसे मॉडल जिन्हें स्वैप किया गया है।

यदि आप इन्हें भी शामिल करना चाहते हैं,

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

Django 1.7 से पहले, बजाय उपयोग:

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

include_auto_createdपैरामीटर सुनिश्चित है कि टेबल परोक्ष द्वारा बनाई गई के माध्यम से ManyToManyFieldरों साथ ही पुनर्प्राप्त किया जाएगा।


2
उसी विधि का उपयोग करके आप सभी मॉडलों को केवल एक ऐप में प्राप्त कर सकते हैं: stackoverflow.com/a/8702854/117268
Emil Stenström

from django.apps.apps import get_modelsउत्पादन ImportError: No module named 'django.apps.apps'... कोई विचार?
आलबर्न

3
from django.apps import apps>>apps.get_models
डिंगो


6

यदि आप सभी मॉडलों के साथ एक शब्दकोश चाहते हैं, जिसका आप उपयोग कर सकते हैं:

from django.apps import apps

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

4

यदि आप खेलना चाहते हैं, और अच्छे समाधान का उपयोग नहीं करना चाहते हैं , तो आप अजगर आत्मनिरीक्षण के साथ थोड़ा खेल सकते हैं:

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

नोट: यह कोड का एक मोटा हिस्सा है; यह मान लेगा कि सभी मॉडल "मॉडेलफ्रेम" में परिभाषित हैं और वे django.db.models.Model से विरासत में मिले हैं।



0

यदि आप अपने मॉडल को व्यवस्थापक एप्लिकेशन के साथ पंजीकृत करते हैं, तो आप व्यवस्थापक दस्तावेज़ीकरण में इन वर्गों की सभी विशेषताओं को देख सकते हैं।


0

यहां डेटाबेस में मौजूद किसी भी अनुमतियों को खोजने और हटाने का एक सरल तरीका है, लेकिन 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))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.