Я ищу общий способ в Python для создания экземпляра класса по его имени аналогично тому, как это делается в Java, без необходимости явно указывать имя класса в условии IF..ELIF.
Это связано с тем, что у меня есть несколько разных моделей и сериализаторов, и я хочу сделать их доступными по параметрам в HTTP-запросе. Это должно улучшить слабую связанность и модульность.
Например, https://www.domain.com/myapp/sampledata.json?model=<modelname>
должен получить классы <modelname>
и <modelname>Serializer
.
Есть некоторые изменения в этом, начиная с Django 1.7 https://docs.djangoproject.com/en/1.7/ref/models/queries/
, до того, как get_model
использовался для аналогичных целей.
Начиная с Django 1.7, django.db.models.loading устарел (будет удален в версии 1.9) в пользу новой системы загрузки приложений.
Предупреждение:
RemovedInDjango19Warning: Утилиты в django.db.models.loading устарели в пользу новой системы загрузки приложений.
return f(*args, **kwds)
Как следует изменить следующий код, чтобы получить класс из строки?
просмотры.py
from myapp.models import Samplemodel, Simplemodel1, Simplemodel2
from myapp.serializers import SamplemodelSerializer, Simplemodel1Serializer, Simplemodel2Serializer
from django.db.models.loading import get_model # deprecated
from myapp.jsonp_decorator import json_response
@json_response
def sampledata(request):
model = request.GET.get('model','Samplemodel')
if model=='Samplemodel':
modelName = "Samplemodel"
serializer = SamplemodelSerializer
elif model=='Simplemodel1':
modelName = "Simplemodel1"
serializer = Simplemodel1Serializer
elif model=='Simplemodel2':
modelName = "Simplemodel2"
serializer = Simplemodel2Serializer
return serializer(get_model("myapp",modelName).objects.all(), many=True)