0

Я ищу общий способ в Python для создания экземпляра класса по его имени аналогичным образом, как это делается на Java без явного указания имени класса в условии IF..ELIF.Django get class from string

Это связано с тем, что у меня есть несколько различных моделей и сериализаторов и вы хотите, чтобы они были адресованы параметрами в 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 являются устаревшими в пользу новой системы загрузки приложений.
возвращение F (* арг, ** kwds)

Как следует следующий код будет изменен, чтобы получить класс из строки?

views.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) 

ответ

1

Вы можете использовать getattr:

import my_serializers 

serializer_class = getattr(my_serializers, 'SimpleSerializer') 
serializer = serializer_class() 
+0

Кажется работать с атрибутами , Мне нужно что-то подобное с моделями и сериализаторами –

+0

Он будет работать для классов внутри модуля с. Это атрибуты модуля. – eugecm

+0

Вы правы, это хорошо работает, я опубликую обновленный код здесь. –

0

Лучший способ разрешить динамический класс нагрузки в этом случае:

from myapp import models 
from myapp import serializers 
from myapp.jsonp_decorator import json_response 

@json_response 
def sampledata(request): 

    model = request.GET.get('model','Samplemodel') 
    serializer_class = getattr(serializers, model+"Serializer") 
    return serializer_class(getattr(models,modelName).objects.all(), many=True) 

 Смежные вопросы

  • Нет связанных вопросов^_^