Как импортировать модель в Django по названию - PullRequest
4 голосов
/ 04 апреля 2011

учитывая строку, идентифицирующую модель Django, я должен получить связанный объект типа <class 'django.db.models.base.ModelBase'> или Нет.

Я собираюсь показать свое решение, которое работает нормально, но выглядит уродливо.Я был бы рад узнать, есть ли лучшие варианты для получения того же результата.Для этого существует что-то вроде ярлыка Django?Спасибо.

>>> from django.utils.importlib import import_module
>>> model = 'sandbox.models.Category'
>>> full_name = model.split(".")
>>> module_name = ".".join(full_name[:-1])
>>> class_name = full_name[-1]
>>> model = getattr(import_module(module_name), class_name, None)
>>> type(model)
<class 'django.db.models.base.ModelBase'>

1 Ответ

7 голосов
/ 04 апреля 2011

Существует ярлык get_model.

from django.db.models import get_model

А вот и его подпись:

def get_model(self, app_label, model_name, seed_cache=True):

А вот как его можно использовать:

>>> from django.db.models import get_model
>>> model = 'amavisd.models.Domain'
>>> app_label, _, class_name  = model.split('.')
>>> model = get_model(app_label, class_name)
>>> type(model)
class 'django.db.models.base.ModelBase'

Для django 1.8 + Вы можете использовать следующий код

>>> from django.apps import apps
>>> apps.get_model('shop', 'Product')
<class 'shop.models.Product'>
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...