当我在django-rest0-framework中创建一个基于ModelSerializer的Serializer时,我将不得不在Meta类中传递模型:
class ClientSerializer(ModelSerializer):
class Meta:
model = Client
我想创建一个通用的序列化程序,它基于URL动态地包含模型 .
我的设置因此包括urls.py和viewset:
urls.py:
url(r'^api/v1/general/(?P<model>\w+)', kernel_api_views.GeneralViewSet.as_view({'get':'list'}))
和views.py:
class GeneralViewSet(viewsets.ModelViewSet):
def get_queryset(self):
# Dynamically get the model class from myapp.models
queryset = getattr(myapp.models, model).objects.all()
return queryset
def get_serializer_class(self):
return getattr(myapp.serializers, self.kwargs['model']+'Serializer')
其中包含:http://127.0.0.1:8000/api/v1/general/Client将Client.objects.all()作为queryset,将ClientSerializer类作为序列化程序
Question: 如何制作它以便我可以调用'GeneralSerializer'并动态分配模型?
4 回答
您可以通过以下方式实现:
serializers.py
views.py
在
serializers.py
中,我们将GeneralSerializer
定义为Meta
,Meta
为None
. 我们将在调用get_serializer_class()
时覆盖model
值 .然后在我们的
views.py
文件中,我们定义GeneralViewSet
,其中get_queryset()
和get_serializer_class()
被覆盖 .在
get_queryset()
中,我们从kwargs
获取model
的值并返回该查询集 .在
get_serializer_class()
中,我们将GeneralSerializer
的model
的值设置为从kwargs
获得的值,然后返回GeneralSerializer
.到目前为止,我知道如果使用模型序列化程序,则无法创建通用序列化程序,但您可以使用基类获取相同的解决方案,并从该基类派生所有模型 . 实现返回序列化程序的方法,然后使用该方法生成动态序列化程序 . 我在过去的两年里使用这种技术并且对我来说工作得很好 -
现在从中推导出你的模型 -
如果要覆盖序列化程序,那么只需在您需要的那个中执行 . 例如 -
多数民众赞成,现在每个类都有自己的动态序列化器,但我们只是在一个地方定义它 .
现在在视图集中使用序列化程序 -
然后从那里继续
以Rahul的答案为基础,这对我有用:
urls.py
serializers.py
views.py
在
Meta
中创建不带model
的通用序列化程序:在``中将
model
添加到序列化器: