python - Create a generic serializer with a dynamic model in Meta -
when create serializer in django-rest0-framework, based on modelserializer, have pass model in meta class:
class clientserializer(modelserializer): class meta: model = client
i want create general serializer which, based on url, includes model dynamically.
my setup thusfar includes urls.py , viewset:
urls.py:
url(r'^api/v1/general/(?p<model>\w+)', kernel_api_views.generalviewset.as_view({'get':'list'}))
and views.py:
class generalviewset(viewsets.modelviewset): def get_queryset(self): # dynamically model class myapp.models queryset = getattr(myapp.models, model).objects.all() return queryset def get_serializer_class(self): return getattr(myapp.serializers, self.kwargs['model']+'serializer')
which in care of: http://127.0.0.1:8000/api/v1/general/client gets client.objects.all() queryset , clientserializer class serializer
question: how can make can call 'generalserializer' , dynamically assign model in it?
you can following:
serializers.py
class generalserializer(serializers.modelserializer): class meta: model = none
views.py
class generalviewset(viewsets.modelviewset): def get_queryset(self): model = self.kwargs.get('model') return model.objects.all() def get_serializer_class(self): generalserializer.meta.model = self.kwargs.get('model') return generalserializer
in serializers.py
, define generalserializer
having model
in meta
none
. we'll override model
value @ time of calling get_serializer_class()
.
then in our views.py
file, define generalviewset
get_queryset()
, get_serializer_class()
overridden.
in get_queryset()
, obtain value of model
kwargs
, return queryset.
in get_serializer_class()
, set value of model
generalserializer
value obtained kwargs
, return generalserializer
.
Comments
Post a Comment