1

我正在寻找一种在 Python 中通过类名来实例化类的通用方法,其方式与在 Java 中的完成方式类似,而无需在 IF..ELIF 条件中显式指定类名。

这是因为我有几个不同的模型和序列化程序,并希望通过 HTTP 请求中的参数使它们可寻址。它是为了增强松散耦合和模块化。

例如https://www.domain.com/myapp/sampledata.json?model=<modelname>应该获取类<modelname><modelname>Serializer.

https://docs.djangoproject.com/en/1.7/ref/models/queries/自从 Django 1.7之前get_model用于类似目的以来,对此进行了一些更改。

从 Django 1.7 开始,不推荐使用 django.db.models.loading(将在 1.9 中删除),以支持新的应用程序加载系统。

警告:

RemovedInDjango19警告:django.db.models.loading 中的实用程序已被弃用,有利于新的应用程序加载系统。
返回 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)  
4

3 回答 3

1

你可以使用getattr

import my_serializers

serializer_class = getattr(my_serializers, 'SimpleSerializer')
serializer = serializer_class()
于 2015-12-01T09:30:47.060 回答
1

对于 Django 3+,获取模型实例的通用方法:

def get_data_instance(model_name):
    """
    Try to find application with name "data" with specific "model_name"
    :param model_name: the name of the class
    :return: model instance or None
    """

    try:
        app_config = apps.get_app_config('data')
        return app_config.get_model(model_name)
    except LookupError:
        pass

    return None
于 2020-03-07T11:37:07.020 回答
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)
于 2015-12-01T16:07:09.497 回答