0

我正在寻找一种Python中的通用方法,以类似的方式实例化类的名称,而不必在IF..ELIF条件中显式指定类名。Django从字符串获取类

这是因为我有几个不同的模型和序列化器,并希望通过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(* ARGS,** 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)