Jawaban:
Pada Django 3.0, itu
AppConfig.get_model(model_name, require_ready=True)
Pada Django 1.9 metodenya adalah
django.apps.AppConfig.get_model(model_name)
.
- danihp
Pada Django 1.7 yang
django.db.models.loading
sudah usang (akan dihapus pada 1.9) mendukung sistem pemuatan aplikasi baru.
- Scott Woodall
Menemukannya. Itu didefinisikan di sini:
from django.db.models.loading import get_model
Didefinisikan sebagai:
def get_model(self, app_label, model_name, seed_cache=True):
from django.apps import AppConfig
django.apps.apps.get_model(model_name)
. Objek AppConfig dimaksudkan untuk tujuan yang berbeda, dan mengharuskan Anda untuk membuat instance AppConfig untuk memanggil get_model()
.
django.db.models.loading
itu usang dalam Django 1,7 ( dihapus dalam 1,9 ) mendukung baru sistem loading aplikasi .
Django 1.7 docs memberi kami yang berikut:
>>> from django.apps import apps
>>> User = apps.get_model(app_label='auth', model_name='User')
>>> print(User)
<class 'django.contrib.auth.models.User'>
hanya untuk siapa saja yang macet (seperti saya):
from django.apps import apps
model = apps.get_model('app_name', 'model_name')
app_name
harus terdaftar menggunakan tanda kutip, sebagaimana mestinya model_name
(yaitu jangan mencoba mengimpornya)
get_model
menerima huruf kecil atau huruf besar 'model_name'
Sebagian besar model "string" muncul sebagai bentuk "appname.modelname" sehingga Anda mungkin ingin menggunakan variasi ini di get_model
from django.db.models.loading import get_model
your_model = get_model ( *your_string.split('.',1) )
Bagian dari kode Django yang biasanya mengubah string tersebut menjadi model sedikit lebih kompleks dari ini 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)
Bagi saya, ini tampaknya menjadi kasus yang baik untuk memisahkan ini menjadi satu fungsi dalam kode inti. Namun, jika Anda tahu string Anda dalam format "App.Model", kedua liner di atas akan berfungsi.
your_model = get_model(*your_string.rsplit('.', 1))
. Label aplikasi terkadang berupa format bertitik, namun nama model selalu merupakan pengidentifikasi yang valid.
apps.get_model
. "Sebagai jalan pintas, metode ini juga menerima satu argumen dalam formulir app_label.model_name
."
Cara terberkati untuk melakukan ini dalam Django 1.7+ adalah:
import django
model_cls = django.apps.apps.get_model('app_name', 'model_name')
Jadi, dalam contoh kanonik semua tutorial kerangka kerja:
import django
entry_cls = django.apps.apps.get_model('blog', 'entry') # Case insensitive
Jika Anda tidak tahu di mana aplikasi model Anda ada, Anda dapat mencarinya dengan cara ini:
from django.contrib.contenttypes.models import ContentType
ct = ContentType.objects.get(model='your_model_name')
model = ct.model_class()
Ingat bahwa nama_model_Anda harus lebih kecil.
Saya tidak yakin di mana hal itu dilakukan di Django, tetapi Anda bisa melakukan ini.
Memetakan nama kelas ke string melalui refleksi.
classes = [Person,Child,Parent]
def find_class(name):
for clls in classes:
if clls.__class__.__name__ == name:
return clls
Berikut ini adalah pendekatan yang kurang spesifik jjango untuk mendapatkan kelas dari string:
mymodels = ['ModelA', 'ModelB']
model_list = __import__('<appname>.models', fromlist=mymodels)
model_a = getattr(model_list, 'ModelA')
atau Anda dapat menggunakan importlib seperti yang ditunjukkan di sini :
import importlib
myapp_models = importlib.import_module('<appname>.models')
model_a = getattr(myapp_models, 'ModelA')
Solusi 2020:
from django.apps import apps
apps.get_model('app_name', 'Model')
per mis Anda:
apps.get_model('people', 'Person')