Skip to content

Instantly share code, notes, and snippets.

@erickmendonca
Created February 1, 2017 17:06
Show Gist options
  • Save erickmendonca/a7252cea66a116edf5bd2146d47782d1 to your computer and use it in GitHub Desktop.
Save erickmendonca/a7252cea66a116edf5bd2146d47782d1 to your computer and use it in GitHub Desktop.
Django REST Framework RouterFactory - build simple APIs automatically
# Use with caution!
from rest_framework import routers, serializers, viewsets
class RouterFactory(object):
def __init__(
self,
router=routers.DefaultRouter(),
models=[],
base_serializer_class=serializers.ModelSerializer,
custom_serializers = {},
custom_viewsets = {}
):
self.router = router
self.models = models
self.base_serializer_class = base_serializer_class
self.viewset_base_class = viewsets.ModelViewSet
self.serializers = custom_serializers
self.viewsets = custom_viewsets
def __convert_to_snake_case(self, camel_case_name):
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', camel_case_name)
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
def build(self):
self.serializers.update({
model: type(
'{model}Serializer'.format(model=model.__name__),
(self.base_serializer_class,),
{
'Meta': type(
'Meta', (object,),
{'model': model, 'fields': '__all__'}
)
}
) for model in self.models if model not in self.serializers.keys()
})
self.viewsets.update({
model: type(
'{model}ViewSet'.format(model=model.__name__),
(self.viewset_base_class,),
{
'queryset': model.objects.all(),
'serializer_class': self.serializers[model]
}
) for model in self.models if model not in self.viewsets.keys()
})
for model in self.models:
self.router.register(r'{model}'.format(
model=self.__convert_to_snake_case(model.__name__)
), self.viewsets[model])
return self.router
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment