Відповіді:
Що стосується Django 3.0, то це
AppConfig.get_model(model_name, require_ready=True)
Станом на Джанго 1.9 цей метод є
django.apps.AppConfig.get_model(model_name)
.
- данихп
Станом на Django 1.7
django.db.models.loading
це застаріле (буде видалено в 1.9) на користь нової системи завантаження додатків.
- Скотт Вуддол
Знайшов це. Тут визначено:
from django.db.models.loading import get_model
Визначено як:
def get_model(self, app_label, model_name, seed_cache=True):
from django.apps import AppConfig
django.apps.apps.get_model(model_name)
. Об'єкти AppConfig призначені для іншої мети, і вам потрібно створити екземпляр AppConfig для виклику get_model()
.
django.db.models.loading
був застарілий в Django 1.7 ( видалено в версії 1.9 ) на користь нової системи завантаження додатків .
Документи Django 1.7 дають нам наступне:
>>> from django.apps import apps
>>> User = apps.get_model(app_label='auth', model_name='User')
>>> print(User)
<class 'django.contrib.auth.models.User'>
Більшість моделей "рядків" відображаються у формі "appname.modelname", тому ви можете використовувати цю варіацію в get_model
from django.db.models.loading import get_model
your_model = get_model ( *your_string.split('.',1) )
Частина коду django, яка зазвичай перетворює такі рядки в модель, трохи складніша. Це з django/db/models/fields/related.py
:
try:
app_label, model_name = relation.split(".")
except ValueError:
# If we can't split, assume a model in current app
app_label = cls._meta.app_label
model_name = relation
except AttributeError:
# If it doesn't have a split it's actually a model class
app_label = relation._meta.app_label
model_name = relation._meta.object_name
# Try to look up the related model, and if it's already loaded resolve the
# string right away. If get_model returns None, it means that the related
# model isn't loaded yet, so we need to pend the relation until the class
# is prepared.
model = get_model(app_label, model_name,
seed_cache=False, only_installed=False)
Для мене, здається, це хороший випадок, щоб розділити це на одну функцію в основному коді. Однак якщо ви знаєте, що ваші рядки у форматі "App.Model", два вкладені вище працюватимуть.
your_model = get_model(*your_string.rsplit('.', 1))
. Мітка програми іноді має крапковий формат, проте назва моделі завжди є дійсним ідентифікатором.
apps.get_model
. "Як ярлик, цей метод також приймає один аргумент у формі app_label.model_name
."
Благодатний спосіб зробити це в Django 1.7+:
import django
model_cls = django.apps.apps.get_model('app_name', 'model_name')
Отже, на канонічному прикладі всіх навчальних посібників:
import django
entry_cls = django.apps.apps.get_model('blog', 'entry') # Case insensitive
Якщо ви не знаєте, в якому додатку існує ваша модель, ви можете шукати її таким чином:
from django.contrib.contenttypes.models import ContentType
ct = ContentType.objects.get(model='your_model_name')
model = ct.model_class()
Пам’ятайте, що ваше ім’я_модель_ має бути з малих літер.
Я не впевнений, де це робиться в Джанго, але ти міг би це зробити.
Зображення назви класу в рядку за допомогою відображення.
classes = [Person,Child,Parent]
def find_class(name):
for clls in classes:
if clls.__class__.__name__ == name:
return clls
Ось менш специфічний для джанго підхід для отримання класу з рядка:
mymodels = ['ModelA', 'ModelB']
model_list = __import__('<appname>.models', fromlist=mymodels)
model_a = getattr(model_list, 'ModelA')
або ви можете використовувати importlib, як показано тут :
import importlib
myapp_models = importlib.import_module('<appname>.models')
model_a = getattr(myapp_models, 'ModelA')
Рішення до 2020 року:
from django.apps import apps
apps.get_model('app_name', 'Model')
на ваш приклад:
apps.get_model('people', 'Person')