{ "info": { "author": "V.Anh Tran", "author_email": "tranvietanh1991@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "drf-routers\n=====================\n\nSourcecode of this package is based from: https://github.com/alanjds/drf-nested-routers\n\nThis package provides routers and fields to create grouped/nested resources in the [Django Rest Framework](http://django-rest-framework.org/)\n\nNested resources are needed for full REST URL structure, if one resource lives inside another.\nGrouped resources allow you to group multiple resource to show in a single root api view.\n\nThe following example is about Domains and DNS Nameservers. \nThere are many domains, and each domain has many nameservers. The \"nameserver\" resource does not\nexist without a domain, so you need it \"nested\" inside the domain.\n\nInstallation\n------------\n\nYou can install this library using pip:\n\n```pip install drf-routers```\n\nQuickstart\n----------\n\nThe desired URL signatures are:\n```\n\\domain\\ <- Domains list\n\\domain\\{pk}\\ <- One domain, from {pk}\n\\domain\\{domain_pk}\\nameservers\\ <- Nameservers of domain from {domain_pk}\n\\domain\\{domain_pk}\\nameservers\\{pk} <- Specific nameserver from {pk}, of domain from {domain_pk}\n```\n\nHow to do it (example):\n```python\n# urls.py\nfrom drf_routers import routers\nfrom views import DomainViewSet, NameserverViewSet\n(...)\n\nrouter = routers.SimpleRouter()\nrouter.register(r'domains', DomainViewSet)\n\ndomains_router = routers.NestedRouter(router, r'domains', lookup='domain')\ndomains_router.register(r'nameservers', NameserverViewSet, base_name='domain-nameservers')\n# 'base_name' is optional. Needed only if the same viewset is registered more than once\n# Official DRF docs on this option: http://www.django-rest-framework.org/api-guide/routers/\n\nurlpatterns = patterns('',\n url(r'^', include(router.urls)),\n url(r'^', include(domains_router.urls)),\n)\n```\n```python\n# views.py\nclass NameserverViewSet(viewsets.ViewSet):\n def list(self, request, domain_pk=None):\n nameservers = self.queryset.filter(domain=domain_pk)\n (...)\n return Response([...])\n\n def retrieve(self, request, pk=None, domain_pk=None):\n nameservers = self.queryset.get(pk=pk, domain=domain_pk)\n (...)\n return Response(serializer.data)\n```\n\n(optional) If you need hyperlinks for nested relations, you need need a custom serializer.\n```python\n# serializers.py\n# (needed only if you want hyperlinks for nested relations on API)\nfrom drf_routers.relations import NestedHyperlinkedRelatedField\n\nclass DomainSerializer(HyperlinkedModelSerializer):\n class Meta:\n model = Domain\n\n nameservers = HyperlinkedIdentityField(\n view_name='domain-nameservers-list',\n lookup_url_kwarg='domain_pk'\n )\n \n\t## OR ##\n \n nameservers = NestedHyperlinkedRelatedField(\n many=True,\n read_only=True, # Or add a queryset\n view_name='domain-nameservers-detail'\n parent_lookup_url_kwarg='domain_pk'\n )\n```\n\n\nExample of nested router 3 levels deep. You can use this same logic to nest routers as deep as you need. This example accomplishes the below URL patterns. \n```\n/clients/\n/clients/{pk}/\n/clients/{client_pk}/maildrops/\n/clients/{client_pk}/maildrops/{maildrop_pk}/\n/clients/{client_pk}/maildrops/{maildrop_pk}/recipients/\n/clients/{client_pk}/maildrops/{maildrop_pk}/recipients/{pk}/\n```\n\n```python\n# urls.py\nrouter = DefaultRouter()\nrouter.register(r'clients', ClientViewSet, base_name='clients')\n\nclient_router = routers.NestedRouter(router, r'clients', lookup='client')\nclient_router.register(r'maildrops', MailDropViewSet, base_name='maildrops')\n\nmaildrops_router = routers.NestedRouter(client_router, r'maildrops', lookup='maildrop')\nmaildrops_router.register(r'recipients', MailRecipientViewSet, base_name='recipients')\n\nurlpatterns = patterns (\n '',\n url(r'^', include(router.urls)),\n url(r'^', include(client_router.urls)),\n url(r'^', include(maildrops_router.urls)),\n)\n```\n\n```python\n# views.py\nclass ClientViewSet(viewsets.ViewSet):\n serializer_class = ClientSerializer\n\n def list(self, request,):\n queryset = Client.objects.filter()\n serializer = ClientSerializer(queryset, many=True)\n return Response(serializer.data)\n\n def retrieve(self, request, pk=None):\n queryset = Client.objects.filter()\n client = get_object_or_404(queryset, pk=pk)\n serializer = ClientSerializer(client)\n return Response(serializer.data)\n \nclass MailDropViewSet(viewsets.ViewSet):\n serializer_class = MailDropSerializer\n\n def list(self, request, client_pk=None):\n queryset = MailDrop.objects.filter(client=client_pk)\n serializer = MailDropSerializer(queryset, many=True)\n return Response(serializer.data)\n\n def retrieve(self, request, pk=None, client_pk=None):\n queryset = MailDrop.objects.filter(pk=pk, client=client_pk)\n maildrop = get_object_or_404(queryset, pk=pk)\n serializer = MailDropSerializer(maildrop)\n return Response(serializer.data)\n \nclass MailRecipientViewSet(viewsets.ViewSet):\n serializer_class = MailRecipientSerializer\n\n def list(self, request, client_pk=None, maildrop_pk=None):\n queryset = MailRecipient.objects.filter(mail_drop__client=client_pk, mail_drop=maildrop_pk)\n serializer = MailRecipientSerializer(queryset, many=True)\n return Response(serializer.data)\n\n def retrieve(self, request, pk=None, client_pk=None, maildrop_pk=None):\n queryset = MailRecipient.objects.filter(pk=pk, mail_drop=maildrop_pk, mail_drop__client=client_pk)\n maildrop = get_object_or_404(queryset, pk=pk)\n serializer = MailRecipientSerializer(maildrop)\n return Response(serializer.data)\n```", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/tranvietanh1991/drf-routers/archive/master.zip", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/tranvietanh1991/drf-routers", "keywords": "django,rest,drf,django-rest-framwork,router,nested,grouped", "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "drf-routers", "package_url": "https://pypi.org/project/drf-routers/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/drf-routers/", "project_urls": { "Download": "https://github.com/tranvietanh1991/drf-routers/archive/master.zip", "Homepage": "https://github.com/tranvietanh1991/drf-routers" }, "release_url": "https://pypi.org/project/drf-routers/0.2/", "requires_dist": null, "requires_python": null, "summary": "Grouped/Nested resources for the Django Rest Framework", "version": "0.2" }, "last_serial": 2248620, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "2176ca6ecedbfe91f5e261df855187ff", "sha256": "a702fd04f55b147fde409ec8553f892b12cf8abf95af1196ac9e0d5de4e59bd4" }, "downloads": -1, "filename": "drf-routers-0.1.tar.gz", "has_sig": false, "md5_digest": "2176ca6ecedbfe91f5e261df855187ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11303, "upload_time": "2016-04-19T16:59:58", "url": "https://files.pythonhosted.org/packages/ca/4f/a47ec53d92c9d6b9bd3077785b262d036ccf304af7a28e901270aa65eb50/drf-routers-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "fcd46ba80d4291031ce2b2ac235bebea", "sha256": "6329f209e19119df0cab4d19be3fef7948654eac38df3ec28d0f74d7e82544f2" }, "downloads": -1, "filename": "drf-routers-0.2.tar.gz", "has_sig": false, "md5_digest": "fcd46ba80d4291031ce2b2ac235bebea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11478, "upload_time": "2016-07-28T09:44:40", "url": "https://files.pythonhosted.org/packages/b5/05/7a117aeef93e792957a6b9e63e39657fd173abaeffe70091e42c3e3350d3/drf-routers-0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "fcd46ba80d4291031ce2b2ac235bebea", "sha256": "6329f209e19119df0cab4d19be3fef7948654eac38df3ec28d0f74d7e82544f2" }, "downloads": -1, "filename": "drf-routers-0.2.tar.gz", "has_sig": false, "md5_digest": "fcd46ba80d4291031ce2b2ac235bebea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11478, "upload_time": "2016-07-28T09:44:40", "url": "https://files.pythonhosted.org/packages/b5/05/7a117aeef93e792957a6b9e63e39657fd173abaeffe70091e42c3e3350d3/drf-routers-0.2.tar.gz" } ] }