一些背景
我有以下的Django/Python的片断:类引用在Python
from rest_framework import serializers
from .models import Profile, Task
class Serializable():
types = {}
def __init__(self, objectid):
self.object = self.types[objectid][0]
self.serializer = self.types[objectid][1]
def serialized(self):
instances = self.object.objects.all()
serialized = self.serializer(instances, many=True)
return serialized
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
oid = 'profile'
model = Profile
fields = ['login', 'status']
Serializable.types[oid] = [model, <class-reference>]
class TaskSerializer(serializers.ModelSerializer):
class Meta:
oid = 'task'
model = Task
fields = ['description', 'date', 'owner']
Serializable.types[oid] = [model, <class-reference>]
我使用Django安装了rest_framework
库。我使用的一个有趣功能是ModelSerializers
(ModelSerializers Documentation),它可以节省很多代码重复。我希望Serializable.types
变量可以在运行时填充(当声明所有序列化器类时)。这一点的重点是,我不必更新我的观点,包括新型号。例如,我会打印我的模型实例的JSON表示这样的:
class QueryObject(APIView):
permission_classes = (AllowAny,)
def get(self, request, *args, **kwargs):
oid = request.GET['oid']
serializable= Serializable(oid)
json = serializable.serialized
return JsonResponse(json)
的问题
的主要问题是在每个Serializer
类的最后一行。
Serializable.types[oid] = [model, <class-reference>]
我试图把类的名称,ProfileSerializer
例如,无济于事。我试图做同样的Meta
类以外,如:
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
oid = 'profile'
model = Profile
fields = ['login', 'status']
Serializable.types[Meta.oid] = [Meta.model, ProfileSerializer]
也没有成功。不知道还有什么可做的,这就是为什么我希望社区能够帮助我做到这一点。
你能解释一下我的Serializable类最终会被调用吗?我可以看到它在ModelSerializerMeta(cls.types)中,但实际定义了cls的位置? – jhc
cls由Python解释器定义。减少一句话就是ModelSerializerMeta代码在解释器遇到您的类定义时执行,然后将其传递给元类以管理类的创建。 如果这还不够,我强烈建议用python metaclasses进行搜索,因为那里写了很多东西,但我真的不知道如何更好地解释它。 –
你可以像平常一样调用你的Serializable类。 –