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)