Django: Как я могу найти список моделей, которые знает ORM?

По существу единственной вещью в Python, который представляет новый объем, является функциональное определение. Классы являются чем-то вроде особого случая, в котором что-либо определенное непосредственно в теле помещается в пространство имен класса, но они не непосредственно доступны из методов (или вложенные классы), они содержат.

В Вашем примере существует только 3 объема, где x будет искаться в:

  • объем спама - содержащий все определенное в code3 и code5 (а также code4, Ваша переменная цикла)

  • глобальная область видимости - содержащий все определенное в code1, а также Foo (и безотносительно изменений после него)

  • builtins пространство имен. Что-то вроде особого случая - это содержит различный Python встроенные функции и типы, такие как len () и str (). Обычно это не должно быть изменено никаким пользовательским кодом, поэтому ожидать, что он будет содержать стандартные функции и ничто иное.

[еще 1113] объемы только появляются при представлении вложенной функции (или лямбда) в изображение. Они будут вести себя в значительной степени, как Вы ожидали бы как бы то ни было. Вложенная функция может получить доступ ко всему в локальном объеме, а также чему-либо в объеме функции включения. например,

def foo():
    x=4
    def bar():
        print x  # Accesses x from foo's scope
    bar()  # Prints 4
    x=5
    bar()  # Prints 5

Ограничения:

к Переменным в объемах кроме переменных локальной функции можно получить доступ, но не могут быть восстановлением к новым параметрам без дальнейшего синтаксиса. Вместо этого присвоение создаст новое локальный переменная вместо того, чтобы влиять на переменную в родительском объеме. Например:

global_var1 = []
global_var2 = 1

def func():
    # This is OK: It's just accessing, not rebinding
    global_var1.append(4) 

    # This won't affect global_var2. Instead it creates a new variable
    global_var2 = 2 

    local1 = 4
    def embedded_func():
        # Again, this doen't affect func's local1 variable.  It creates a 
        # new local variable also called local1 instead.
        local1 = 5
        print local1

    embedded_func() # Prints 5
    print local1    # Prints 4

для фактического изменения привязки глобальных переменных из функционального объема, необходимо определить, что переменная глобальна с глобальным ключевым словом. Например:

global_var = 4
def change_global():
    global global_var
    global_var = global_var + 1

В настоящее время нет никакого способа сделать то же для переменных во включении функция , объемы, но Python 3 представляет новое ключевое слово, "nonlocal", который будет действовать похожим способом к глобальному, но для объемов вложенной функции.

77
задан interstar 14 July 2009 в 12:40
поделиться

4 ответа

Если вы зарегистрируете свои модели в приложении администратора, вы сможете увидеть все атрибуты этих классов в документации администратора.

0
ответ дан 24 November 2019 в 10:51
поделиться

Если вы хотите играть, а не использовать хорошее решение , вы можете немного поиграть с интроспекцией 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

Примечание: это довольно грубая часть код; он будет предполагать, что все модели определены в «models.py» и наследуются от django.db.models.Model.

4
ответ дан 24 November 2019 в 10:51
поделиться

Простое решение:

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 s, также будут извлечены.

159
ответ дан 24 November 2019 в 10:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: