Как получить динамический класс Django?
Не имея полного пути к модулю Django, можно ли сделать что-то вроде:
model = 'User' [in Django namespace]
model.objects.all()
... в отличие от:
User.objects.all().
EDIT: Я пытаюсь сделать этот вызов на основе ввода в командной строке. Можно ли избежать оператора импорта, например,
model = django.authx.models.User
Без Django, возвращающего ошибку:
"global name django is not defined."
Ответы
Ответ 1
Я думаю, что вы ищете это:
from django.db.models.loading import get_model
model = get_model('app_name', 'model_name')
Конечно, есть и другие методы, но я бы справился с этим, если вы не знаете, какой файл моделей вам нужно импортировать в ваше пространство имен. (Обратите внимание, что на самом деле нет способа безопасно получить модель, не зная сначала, к какому приложению она принадлежит. Посмотрите исходный код файла loading.py, если вы хотите проверить свою удачу при переборе всех моделей приложений.)
Обновление для Django 1. 7+: Согласно временной шкале устаревания Django, django.db.models.loading
устарел в Django 1.7 и будет удален в Django 1.9. Как указано в ответе Alasdair, в Django 1. 7+ есть реестр приложений. Вы можете использовать метод apps.get_model
для динамического получения модели:
from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
Ответ 2
Для Django 1.7+ существует реестр приложений. Вы можете использовать метод apps.get_model
для динамического получения модели.
from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
Ответ 3
from django.authx.models import User
model = User
model.objects.all()
Ответ 4
model = django.auспасибо .models.User
? Django возвращает ошибку: "global имя django не определено.
Django не возвращает ошибку. Python делает.
Во-первых, вы ДОЛЖНЫ импортировать модель. Вы должны импортировать его с помощью
from django.authx.models import User
Во-вторых, если вы получили сообщение об ошибке, что django
не определено, то Django установлен неправильно. У вас должен быть Django на вашем PYTHONPATH
или установлен в ваших пакетах lib/site Python.
Чтобы правильно установить Django, см. http://docs.djangoproject.com/en/dev/intro/install/#intro-install
Ответ 5
Классы являются объектами "первого класса" в Python, то есть они могут передаваться и обрабатываться точно так же, как и все другие объекты.
Модели - это классы - вы можете сказать, что вы создаете новые модели с помощью операторов класса:
class Person(models.Model):
last_name = models.CharField(max_length=64)
class AnthropomorphicBear(models.Model):
last_name = models.CharField(max_length=64)
Оба идентификатора Person
и AnthropomorphicBear
привязаны к классам Django, поэтому вы можете их передавать. Это может быть полезно, если вы хотите создать вспомогательные функции, которые работают на уровне модели (и совместно используют общий интерфейс):
def print_obj_by_last_name(model, last_name):
model_name = model.__name__
matches = model.objects.filter(last_name=last_name).all()
print('{0}: {1!r}'.format(model_name, matches))
Итак, print_obj_by_last_name
будет работать с моделями Person
или AnthropomorphicBear
. Просто передайте модель так:
print_obj_by_last_name(model=Person, last_name='Dole')
print_obj_by_last_name(model=AnthropomorphicBear, last_name='Fozzy')
Ответ 6
Если у вас есть имя модели, переданное как строка, я предполагаю, что один из способов может быть
modelname = "User"
model = globals()[modelname]
Но сбой в globals() может быть немного опасным в некоторых контекстах. Поэтому обращайтесь с осторожностью:)