{ "info": { "author": "Sagar Adhikari", "author_email": "ska80117@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "\n# DRF Nested Relations\n\nThis python package is an extension for django rest framework for creating, updating and deleting nested relations. The nested relations can go to `any depth`.\n\nIt receives nested data as list of dictionaries. \nIt works for generic relations and foreign keys for now.\n\n\n* If the dictionary contains `id` field, the nested data will be updated.\n\n* If the dictionary does not contain `id`, field , new data will be created.\n\n* If the dictionary contains only `id` as key, the data will be deleted.\n\n# Usage\n\n### Models \n\n```python\nfrom django.db import models\nfrom django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation\nfrom django.contrib.contenttypes.models import ContentType\n\nclass ContactData(models.Model):\n content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=True, null=True)\n object_id = models.PositiveIntegerField(blank=True, null=True)\n content_object = GenericForeignKey()\n phone = models.CharField(max_length=25,blank=True, null=True)\n email = models.EmailField()\n\nclass Person(models.Model):\n name = models.CharField(max_length=50)\n contact_data = GenericRelation(ContactData, related_query_name='content_obj_person')\n\nclass Skill(models.Model):\n name = models.CharField(max_length=50)\n person = models.ForeignKey('Person', related_name='skills', on_delete=models.CASCADE)\n````\n\n### Serializers\n\n```Python\nfrom rest_framework import serializers\nfrom nested_relations.serializers import NestedDataModelSerializer\nfrom .models import ContactData, Person, Skill\n\nclass ContactDataSerializer(serializers.ModelSerializer):\n class Meta:\n model = ContactData\n exclude = ('content_type', 'object_id')\n\nclass SkillSerializer(serializers.ModelSerializer):\n class Meta:\n model = Skill\n exclude = ('person',)\n\nclass PersonSerializer(NestedDataModelSerializer):\n\n contact_data = serializers.JSONField(required=False, allow_null=True)\n skills = serializers.JSONField(required=False, allow_null=True)\n\n class Meta:\n model = Person\n fields = '__all__'\n nestedSerializer = {\n 'contact_data': {'serializer_class': ContactDataSerializer, 'many': True, 'kwargs': 'content_object'},\n 'skills':{'serializer_class': SkillSerializer, 'many': True, 'kwargs': 'person'}\n }\n\n\n```\n\n\n* For generic relation , \nuse `field_name = serializers.JSONField()` and same `field_name` in nested serializer. (An attribute in main model that points to nested relation)\n\n* For foreign key, \nUse `related_name = serializers.JSONField()` and same `related_name` in nested serializer. (An attribute in main model that points to nested relation)\n\n* For both,\nProvide `many=True`. The value for `kwargs` is clear from example. It is an attribute in nested relation that points to main model.\n\n## Writing data\n```python\n# Creating a person\n\ndata = {\n \"contact_data\": [{\"email\":\"1@1.com\"},{\"email\":\"2@2.com\"}, {\"email\":\"3@3.com\"}],\n \"name\": \"Sagar\"\n}\n\nperson_serializer = PersonSerializer(data=data, context={'request':request})\nperson_serializer.is_valid(raise_exception=True)\nperson = person_serializer.save()\nprint(person_serializer.data)\n\n{\n \"id\": 3,\n \"contact_data\": [\n {\n \"id\": 4,\n \"phone\": null,\n \"email\": \"1@1.com\"\n },\n {\n \"id\": 5,\n \"phone\": null,\n \"email\": \"2@2.com\"\n },\n {\n \"id\": 6,\n \"phone\": null,\n \"email\": \"3@3.com\"\n }\n ],\n \"skills\": [],\n \"name\": \"Sagar\"\n}\n\n# Updating the person\ndata = {\n \"id\": 3,\n \"contact_data\": [\n { # update\n \"id\": 4, \n \"phone\": null,\n \"email\": \"1@1edit.com\"\n },\n { # delete\n \"id\": 5 \n },\n { # create \n \"phone\": null, \n \"email\": \"4@4.com\"\n }\n ],\n \"skills\": [],\n \"name\": \"Sagar\"\n}\n\nperson_serializer = PersonSerializer(person, data=data, context={'request':request})\nperson_serializer.save()\nprint(person_serializer.data)\n\n{\n \"id\": 3,\n \"contact_data\": [\n {\n \"id\": 4,\n \"phone\": null,\n \"email\": \"1@1edit.com\"\n },\n { # no change\n \"id\": 6,\n \"phone\": null,\n \"email\": \"3@3.com\" \n },\n {\n \"id\": 7,\n \"phone\": null,\n \"email\": \"4@4.com\"\n }\n ],\n \"skills\": [],\n \"name\": \"Sagar\"\n}\n```\n## Deeper Relations\nFor deeper relations, the nested serializer should further inherit `NestedDataModelSerializer` and their corresponding nested serializers have to be provided.\n\n\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/SagarKAdhikari/drf-nested-relations", "keywords": "", "license": "BSD License", "maintainer": "", "maintainer_email": "", "name": "drf-nested-relations", "package_url": "https://pypi.org/project/drf-nested-relations/", "platform": "", "project_url": "https://pypi.org/project/drf-nested-relations/", "project_urls": { "Homepage": "https://github.com/SagarKAdhikari/drf-nested-relations" }, "release_url": "https://pypi.org/project/drf-nested-relations/0.0.2/", "requires_dist": null, "requires_python": "", "summary": "An extension of django rest framework that allows writing nested relations", "version": "0.0.2" }, "last_serial": 5117609, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "f1d10d946eb3aef715c39c0dc18399c5", "sha256": "4e977dabd3b90764a36c86e0fcce9e4c36b59168cb3c1ac314474061d15e2087" }, "downloads": -1, "filename": "drf_nested_relations-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "f1d10d946eb3aef715c39c0dc18399c5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8097, "upload_time": "2019-04-07T13:52:43", "url": "https://files.pythonhosted.org/packages/d5/08/bddddb980a74b3558cd5b93bdfd34a27f81e5006676a13da2b71291e3c60/drf_nested_relations-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "997b44d77e6b8be87903869ab4fe3433", "sha256": "ff17f236cc815ffa8886cbbe5e3507487ae14e2f854bb59c5dee7d401312d9b0" }, "downloads": -1, "filename": "drf-nested-relations-0.0.1.tar.gz", "has_sig": false, "md5_digest": "997b44d77e6b8be87903869ab4fe3433", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4984, "upload_time": "2019-04-07T13:52:45", "url": "https://files.pythonhosted.org/packages/7c/9b/6eabdf3f9da9d653939e55a885811855ba5b85276ac6377e6af63a51e85d/drf-nested-relations-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "38e62f92c64b6e40051609e1b2871667", "sha256": "42578e5f11cf8f9ec7c455e34ee1bf6ee7d56c22d13f7dea285e3bfce7506e15" }, "downloads": -1, "filename": "drf_nested_relations-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "38e62f92c64b6e40051609e1b2871667", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7976, "upload_time": "2019-04-09T08:48:57", "url": "https://files.pythonhosted.org/packages/f0/85/3dcff3d9bfc98273bb43807a32fd6a85884c1abf504a469c0ebec7667979/drf_nested_relations-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "065b9ae4fdba65d84780b45c647f6908", "sha256": "b25d89800101549146a1c447f5bfb576ee6b2875d8594f2a7aa6f09f0fc12ded" }, "downloads": -1, "filename": "drf-nested-relations-0.0.2.tar.gz", "has_sig": false, "md5_digest": "065b9ae4fdba65d84780b45c647f6908", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4916, "upload_time": "2019-04-09T08:48:59", "url": "https://files.pythonhosted.org/packages/a6/23/3fcf743ad8d7a56faddeade77e254f864a08b66538b7c9743899f9635fd4/drf-nested-relations-0.0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "38e62f92c64b6e40051609e1b2871667", "sha256": "42578e5f11cf8f9ec7c455e34ee1bf6ee7d56c22d13f7dea285e3bfce7506e15" }, "downloads": -1, "filename": "drf_nested_relations-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "38e62f92c64b6e40051609e1b2871667", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7976, "upload_time": "2019-04-09T08:48:57", "url": "https://files.pythonhosted.org/packages/f0/85/3dcff3d9bfc98273bb43807a32fd6a85884c1abf504a469c0ebec7667979/drf_nested_relations-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "065b9ae4fdba65d84780b45c647f6908", "sha256": "b25d89800101549146a1c447f5bfb576ee6b2875d8594f2a7aa6f09f0fc12ded" }, "downloads": -1, "filename": "drf-nested-relations-0.0.2.tar.gz", "has_sig": false, "md5_digest": "065b9ae4fdba65d84780b45c647f6908", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4916, "upload_time": "2019-04-09T08:48:59", "url": "https://files.pythonhosted.org/packages/a6/23/3fcf743ad8d7a56faddeade77e254f864a08b66538b7c9743899f9635fd4/drf-nested-relations-0.0.2.tar.gz" } ] }