Created
February 27, 2021 03:06
-
-
Save hemanth-sp/a0e4122c3c83b2d7d4e971fdf974c59b to your computer and use it in GitHub Desktop.
Django rest API view inheritance or Django rest view hierarchy in detail
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class View: | |
""" | |
Intentionally simple parent class for all views. Only implements | |
dispatch-by-method and simple sanity checking. | |
""" | |
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] | |
class APIView(View): | |
# The following policies may be set at either globally, or per-view. | |
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES | |
parser_classes = api_settings.DEFAULT_PARSER_CLASSES | |
authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES | |
throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES | |
permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES | |
content_negotiation_class = api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS | |
metadata_class = api_settings.DEFAULT_METADATA_CLASS | |
versioning_class = api_settings.DEFAULT_VERSIONING_CLASS | |
class GenericAPIView(views.APIView): | |
""" | |
Base class for all other generic views. | |
""" | |
# You'll need to either set these attributes, | |
# or override `get_queryset()`/`get_serializer_class()`. | |
# If you are overriding a view method, it is important that you call | |
# `get_queryset()` instead of accessing the `queryset` property directly, | |
# as `queryset` will get evaluated only once, and those results are cached | |
# for all subsequent requests. | |
queryset = None | |
serializer_class = None | |
# If you want to use object lookups other than pk, set 'lookup_field'. | |
# For more complex lookup requirements override `get_object()`. | |
lookup_field = 'pk' | |
lookup_url_kwarg = None | |
class GenericViewSet(ViewSetMixin, generics.GenericAPIView): | |
""" | |
The GenericViewSet class does not provide any actions by default, | |
but does include the base set of generic view behavior, such as | |
the `get_object` and `get_queryset` methods. | |
""" | |
pass | |
class ViewSetMixin: | |
""" | |
This is the magic. | |
Overrides `.as_view()` so that it takes an `actions` keyword that performs | |
the binding of HTTP methods to actions on the Resource. | |
For example, to create a concrete view binding the 'GET' and 'POST' methods | |
to the 'list' and 'create' actions... | |
view = MyViewSet.as_view({'get': 'list', 'post': 'create'}) | |
""" | |
class ViewSet(ViewSetMixin, views.APIView): | |
""" | |
The base ViewSet class does not provide any actions by default. | |
""" | |
pass | |
class ModelViewSet(mixins.CreateModelMixin, | |
mixins.RetrieveModelMixin, | |
mixins.UpdateModelMixin, | |
mixins.DestroyModelMixin, | |
mixins.ListModelMixin, | |
GenericViewSet): | |
""" | |
A viewset that provides default `create()`, `retrieve()`, `update()`, | |
`partial_update()`, `destroy()` and `list()` actions. | |
""" | |
pass | |
class CreateModelMixin: | |
""" | |
Create a model instance. | |
""" | |
def create(self, request, *args, **kwargs): | |
serializer = self.get_serializer(data=request.data) | |
serializer.is_valid(raise_exception=True) | |
self.perform_create(serializer) | |
headers = self.get_success_headers(serializer.data) | |
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) | |
class ListAPIView(mixins.ListModelMixin, | |
GenericAPIView): | |
""" | |
Concrete view for listing a queryset. | |
""" | |
def get(self, request, *args, **kwargs): | |
return self.list(request, *args, **kwargs) | |
class ListModelMixin: | |
""" | |
List a queryset. | |
""" | |
def list(self, request, *args, **kwargs): | |
queryset = self.filter_queryset(self.get_queryset()) | |
page = self.paginate_queryset(queryset) | |
if page is not None: | |
serializer = self.get_serializer(page, many=True) | |
return self.get_paginated_response(serializer.data) | |
serializer = self.get_serializer(queryset, many=True) | |
return Response(serializer.data) | |
Sorry, I didn't get you, this gist showed how view level inheritance used in rest api
Sorry, from my side. I should have explained it better. I could not find the above code (or import of View) in your example here? The imports are missing, and that's what confuses me. That's why I ask how do you apply it in your URLs or viewset.py? And I liked your medium article, that's why I started to look into your Github repositories.
Oh sorry, please change the branch in GitHub for every example I created separate branch
I am really sorry, somehow it seems that I am in infantile, but I don't see the branch which includes the above code or how to apply it? I know about the problem, and like to avoid it. That why I am so keen to see how you included it.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
How do you use it, I could not see an example?