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