一些背景
我有以下的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類。 –