{ "info": { "author": "beda.software", "author_email": "drfwritablenested@beda.software", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.10", "Framework :: Django :: 1.11", "Framework :: Django :: 1.9", "Framework :: Django :: 2.0", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Internet :: WWW/HTTP" ], "description": "DRF Writable Nested\n====================\n[![Build Status](https://travis-ci.org/beda-software/drf-writable-nested.svg?branch=master)](https://travis-ci.org/beda-software/drf-writable-nested)\n[![codecov](https://codecov.io/gh/beda-software/drf-writable-nested/branch/master/graph/badge.svg)](https://codecov.io/gh/beda-software/drf-writable-nested)\n[![pypi](https://img.shields.io/pypi/v/drf-writable-nested.svg)](https://pypi.python.org/pypi/drf-writable-nested)\n\nThis is a writable nested model serializer for Django REST Framework which\nallows you to create/update your models with related nested data.\n\nThe following relations are supported:\n- OneToOne (direct/reverse)\n- ForeignKey (direct/reverse)\n- ManyToMany (direct/reverse excluding m2m relations with through model)\n- GenericRelation (this is always only reverse)\n\nRequirements\n============\n\n- Python (2.7, 3.5, 3.6)\n- Django (1.9, 1.10, 1.11, 2.0)\n- djangorestframework (3.5+)\n\nInstallation\n============\n\n```\npip install drf-writable-nested\n```\n\nUsage\n=====\n\nFor example, for the following model structure:\n```python\nfrom django.db import models\n\n\nclass Site(models.Model):\n url = models.CharField(max_length=100)\n\n\nclass User(models.Model):\n username = models.CharField(max_length=100)\n\n\nclass AccessKey(models.Model):\n key = models.CharField(max_length=100)\n\n\nclass Profile(models.Model):\n sites = models.ManyToManyField(Site)\n user = models.OneToOneField(User)\n access_key = models.ForeignKey(AccessKey, null=True)\n\n\nclass Avatar(models.Model):\n image = models.CharField(max_length=100)\n profile = models.ForeignKey(Profile, related_name='avatars')\n```\n\nWe should create the following list of serializers:\n\n```python\nfrom rest_framework import serializers\nfrom drf_writable_nested import WritableNestedModelSerializer\n\n\nclass AvatarSerializer(serializers.ModelSerializer):\n image = serializers.CharField()\n\n class Meta:\n model = Avatar\n fields = ('pk', 'image',)\n\n\nclass SiteSerializer(serializers.ModelSerializer):\n url = serializers.CharField()\n\n class Meta:\n model = Site\n fields = ('pk', 'url',)\n\n\nclass AccessKeySerializer(serializers.ModelSerializer):\n\n class Meta:\n model = AccessKey\n fields = ('pk', 'key',)\n\n\nclass ProfileSerializer(WritableNestedModelSerializer):\n # Direct ManyToMany relation\n sites = SiteSerializer(many=True)\n\n # Reverse FK relation\n avatars = AvatarSerializer(many=True)\n\n # Direct FK relation\n access_key = AccessKeySerializer(allow_null=True)\n\n class Meta:\n model = Profile\n fields = ('pk', 'sites', 'avatars', 'access_key',)\n\n\nclass UserSerializer(WritableNestedModelSerializer):\n # Reverse OneToOne relation\n profile = ProfileSerializer()\n\n class Meta:\n model = User\n fields = ('pk', 'profile', 'username',)\n```\n\nAlso, you can use `NestedCreateMixin` or `NestedUpdateMixin` from this package\nif you want to support only create or update logic.\n\nFor example, we can pass the following data with related nested fields to our\nmain serializer:\n\n```python\ndata = {\n 'username': 'test',\n 'profile': {\n 'access_key': {\n 'key': 'key',\n },\n 'sites': [\n {\n 'url': 'http://google.com',\n },\n {\n 'url': 'http://yahoo.com',\n },\n ],\n 'avatars': [\n {\n 'image': 'image-1.png',\n },\n {\n 'image': 'image-2.png',\n },\n ],\n },\n}\n\nuser_serializer = UserSerializer(data=data)\nuser_serializer.is_valid(raise_exception=True)\nuser = user_serializer.save()\n```\n\nThis serializer will automatically create all nested relations and we receive a\ncomplete instance with filled data.\n```python\nuser_serializer = UserSerializer(instance=user)\nprint(user_serializer.data)\n```\n\n```python\n{\n 'pk': 1,\n 'username': 'test',\n 'profile': {\n 'pk': 1,\n 'access_key': {\n 'pk': 1,\n 'key': 'key'\n },\n 'sites': [\n {\n 'pk': 1,\n 'url': 'http://google.com',\n },\n {\n 'pk': 2,\n 'url': 'http://yahoo.com',\n },\n ],\n 'avatars': [\n {\n 'pk': 1,\n 'image': 'image-1.png',\n },\n {\n 'pk': 2,\n 'image': 'image-2.png',\n },\n ],\n },\n}\n```\n\nIt is also possible to pass through values to nested serializers from the call\nto the base serializer's `save` method. These `kwargs` must be of type `dict`. E g:\n\n```python\n# user_serializer created with 'data' as above\nuser = user_serializer.save(\n profile={\n 'access_key': {'key': 'key2'},\n },\n)\nprint(user.profile.access_key.key)\n```\n\n```python\n'key2'\n```\n\nNote: The same value will be used for all nested instances like default value but with higher priority.\n\n\nKnown problems with solutions\n=============================\n\n\n##### Validation problem for nested serializers with unique fields on update\nWe have a special mixin `UniqueFieldsMixin` which solves this problem.\nThe mixin moves` UniqueValidator`'s from the validation stage to the save stage.\n\nIf you want more details, you can read related issues and articles:\nhttps://github.com/beda-software/drf-writable-nested/issues/1\nhttp://www.django-rest-framework.org/api-guide/validators/#updating-nested-serializers\n\n###### Example of usage:\n```\nclass Child(models.Model):\n field = models.CharField(unique=True)\n\n\nclass Parent(models.Model):\n child = models.ForeignKey('Child')\n\n\nclass ChildSerializer(UniqueFieldsMixin, serializers.ModelSerializer):\n class Meta:\n model = Child\n\n\nclass ParentSerializer(NestedUpdateMixin, serializers.ModelSerializer):\n child = ChildSerializer()\n\n class Meta:\n model = Parent\n```\n\nNote: `UniqueFieldsMixin` must be applied only on serializer\nwhich has unique fields.\n\n###### Mixin ordering\nWhen you are using both mixins\n(`UniqueFieldsMixin` and `NestedCreateMixin` or `NestedUpdateMixin`)\nyou should put `UniqueFieldsMixin` ahead.\n\nFor example:\n```\nclass ChildSerializer(UniqueFieldsMixin, NestedUpdateMixin,\n serializers.ModelSerializer):\n```\n\n\n\n\nAuthors\n=======\n2014-2018, beda.software", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/beda-software/drf-writable-nested", "keywords": "drf restframework rest_framework django_rest_framework serializers drf_writable_nested", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "drf-writable-nested", "package_url": "https://pypi.org/project/drf-writable-nested/", "platform": "", "project_url": "https://pypi.org/project/drf-writable-nested/", "project_urls": { "Homepage": "http://github.com/beda-software/drf-writable-nested" }, "release_url": "https://pypi.org/project/drf-writable-nested/0.5.1/", "requires_dist": null, "requires_python": "", "summary": "Writable nested helpers for django-rest-framework's serializers", "version": "0.5.1" }, "last_serial": 4278413, "releases": { "0.0.2": [], "0.0.3": [ { "comment_text": "", "digests": { "md5": "691bf1eb480527116f7a277e2c53bb47", "sha256": "b77fa4030db08cfb76c1069f2217a88ed9bee0470106db2a876d06313ce9149c" }, "downloads": -1, "filename": "drf-writable-nested-0.0.3.tar.gz", "has_sig": false, "md5_digest": "691bf1eb480527116f7a277e2c53bb47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7893, "upload_time": "2017-02-18T13:25:24", "url": "https://files.pythonhosted.org/packages/ea/01/ba0ad9f6c001175d50e72f29dc138f68358b34810cfb9b13fc9b170930dc/drf-writable-nested-0.0.3.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "6ce96091b7049a9aa31d29ad7bae8718", "sha256": "875cfb76343a676332abfde2e1b3c590169052665a2f3583138947ab4aeb8250" }, "downloads": -1, "filename": "drf-writable-nested-0.1.0.tar.gz", "has_sig": false, "md5_digest": "6ce96091b7049a9aa31d29ad7bae8718", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6425, "upload_time": "2017-02-20T14:15:55", "url": "https://files.pythonhosted.org/packages/0e/34/baa43ad4e8eff5647faa06792c3b9c2e4432dc4c3516a29ce9346c101564/drf-writable-nested-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "73a56dd362d8d068cf779d4c52e9755a", "sha256": "0391e337f79b7c28e13f2ef7df0a45a75c682432df8ba7b5da15a8513519699b" }, "downloads": -1, "filename": "drf-writable-nested-0.1.1.tar.gz", "has_sig": false, "md5_digest": "73a56dd362d8d068cf779d4c52e9755a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6464, "upload_time": "2017-03-21T06:33:20", "url": "https://files.pythonhosted.org/packages/a2/01/b8b053686d4294c2700cb3610edc7285f492faac31ee7766f968687607e6/drf-writable-nested-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "461c23ea9044b3f24368eba99fd95c95", "sha256": "403d09ecad768381a474ac960ab169334cb9890940b7ab2815e690fe5f108872" }, "downloads": -1, "filename": "drf-writable-nested-0.1.2.tar.gz", "has_sig": false, "md5_digest": "461c23ea9044b3f24368eba99fd95c95", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6507, "upload_time": "2017-03-21T09:51:52", "url": "https://files.pythonhosted.org/packages/03/68/c90f90838ae8d329ae7e87241c276d96709070ad452a986ceea031205ea6/drf-writable-nested-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "f7dbf426a7c3c7cbeb6837ec63050d3b", "sha256": "2ca379b845fd3d8ed4052798654a9cc2a80838a93785221552ddd97ee1a8f675" }, "downloads": -1, "filename": "drf-writable-nested-0.1.3.tar.gz", "has_sig": false, "md5_digest": "f7dbf426a7c3c7cbeb6837ec63050d3b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6537, "upload_time": "2017-05-07T05:26:05", "url": "https://files.pythonhosted.org/packages/f2/de/7c126f689c473a945a4d41c4af72aba6122030fd4bd3c613ac1213d9fe39/drf-writable-nested-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "231554c3fac90d5ca7ada2f59f517268", "sha256": "ae31d4dc317c352c1242523a5b5ba751102bc0772181681d5e927851a4b157ad" }, "downloads": -1, "filename": "drf-writable-nested-0.1.4.tar.gz", "has_sig": false, "md5_digest": "231554c3fac90d5ca7ada2f59f517268", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6707, "upload_time": "2017-05-22T04:04:44", "url": "https://files.pythonhosted.org/packages/60/31/d7f7a3c4f5c8d699cbfe92e9bbc14ba3c2302d6dda0014344aab4f100f73/drf-writable-nested-0.1.4.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "2d43e8402e4b746a8352a0aa899649d9", "sha256": "8ac0219c2fa7ad2b9dd651fa7c5ad934b85e488c0244357f0761c262fe249074" }, "downloads": -1, "filename": "drf-writable-nested-0.2.0.tar.gz", "has_sig": false, "md5_digest": "2d43e8402e4b746a8352a0aa899649d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7043, "upload_time": "2017-06-22T02:54:57", "url": "https://files.pythonhosted.org/packages/f3/0d/d7834cffb9de1de9974ef3e786c86c1ae5273312f4154f00ab3201d3d2e2/drf-writable-nested-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "d45b7ecf434f002c638b9d7c679d537d", "sha256": "55dc3abde6fba58dcc5605e40efe496f3f97d6220dc92c536e4f113e8b944af7" }, "downloads": -1, "filename": "drf-writable-nested-0.2.1.tar.gz", "has_sig": false, "md5_digest": "d45b7ecf434f002c638b9d7c679d537d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7073, "upload_time": "2017-08-16T04:45:42", "url": "https://files.pythonhosted.org/packages/77/c0/2edaf41d6687623ff6b63a1f223a5f27f4cef6079a28ef1421736d4d6b12/drf-writable-nested-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "b43c9e4129f853d7ed1fff289bdc34d0", "sha256": "d7a67b71ede298338162b8d0807856a833a117d5da72c6a3bbfe67e9e7e0fae2" }, "downloads": -1, "filename": "drf-writable-nested-0.3.0.tar.gz", "has_sig": false, "md5_digest": "b43c9e4129f853d7ed1fff289bdc34d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7034, "upload_time": "2017-08-16T04:46:15", "url": "https://files.pythonhosted.org/packages/03/5d/1358fe35d2e5aee665dc42f0cfd06bd93dbdbf18e0248e8d1dacc67e4fc1/drf-writable-nested-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "9d759260dfdbc258e7abd2857b3acceb", "sha256": "c878f2fea134731dd1b8747e248649109d480fb60e28553f59db22c9de459d03" }, "downloads": -1, "filename": "drf-writable-nested-0.3.1.tar.gz", "has_sig": false, "md5_digest": "9d759260dfdbc258e7abd2857b3acceb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7059, "upload_time": "2017-10-13T04:09:23", "url": "https://files.pythonhosted.org/packages/0e/ff/622f613f7008c126031ac96972c11b8bdd7abb963de22f04a7a50bc792a0/drf-writable-nested-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "8aa6906d95e889db9db2a637071bfa17", "sha256": "87caf734cc83d5fb44589e8919c4bf32efa59d944c93f8da8f91dac06b8dd488" }, "downloads": -1, "filename": "drf-writable-nested-0.3.2.tar.gz", "has_sig": false, "md5_digest": "8aa6906d95e889db9db2a637071bfa17", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7136, "upload_time": "2017-11-19T06:17:48", "url": "https://files.pythonhosted.org/packages/ea/42/0d1706afcbe0cc7cecafc9795601a2e80681696050f4576df2df36e9ed8c/drf-writable-nested-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "6df094ea40992f802924efd2ddb185b7", "sha256": "78bb8470d2c8bc772a68bc1f344f8b7002f173b7bc44c60ac46fe4ff2da6c657" }, "downloads": -1, "filename": "drf-writable-nested-0.3.3.tar.gz", "has_sig": false, "md5_digest": "6df094ea40992f802924efd2ddb185b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8050, "upload_time": "2018-01-20T05:05:07", "url": "https://files.pythonhosted.org/packages/3e/6e/b3ba58a9435d0861ad3345941ac26f719ba08bcc825dc9520a3f398f115c/drf-writable-nested-0.3.3.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "aa9a7d019906a654f3d410fa1503007f", "sha256": "5fd83da52a25c1856e66b8819c54041f0255bfdfc613cb7ea2f868d05526e2b9" }, "downloads": -1, "filename": "drf-writable-nested-0.4.1.tar.gz", "has_sig": false, "md5_digest": "aa9a7d019906a654f3d410fa1503007f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8070, "upload_time": "2018-01-20T05:21:31", "url": "https://files.pythonhosted.org/packages/ec/c1/8b5dca1ac49bed6bd795ad4728f36d3639a7d20a34398c8ad57018e6b8e0/drf-writable-nested-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "42d2a493b91de5530ff329dc69538e2c", "sha256": "72e77e610c568ee4dc3f2be1efd324c915c7e0ddaa97cab02a006e7d5c076751" }, "downloads": -1, "filename": "drf-writable-nested-0.4.2.tar.gz", "has_sig": false, "md5_digest": "42d2a493b91de5530ff329dc69538e2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8251, "upload_time": "2018-04-20T17:30:57", "url": "https://files.pythonhosted.org/packages/05/3e/85e974d017c4b4a5c8723b127f5a6de88c243f9e02116bfae3a9ed7d8bc6/drf-writable-nested-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "51f17794497b906aa77a7fc808b660dd", "sha256": "728ee97dfe4e912334cb469cfcfb9a19f42f5ec85b58fe91775273be3b19deaa" }, "downloads": -1, "filename": "drf-writable-nested-0.4.3.tar.gz", "has_sig": false, "md5_digest": "51f17794497b906aa77a7fc808b660dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7848, "upload_time": "2018-07-04T11:10:42", "url": "https://files.pythonhosted.org/packages/8b/95/61a5764ec17cf6ef0c46f1374c1a05975cd7fa6292c0e7a3fd292f9c265e/drf-writable-nested-0.4.3.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "101b5cba6201011c4ec01e0ea0a0b931", "sha256": "7038bb1310a76e60a13be0aed899f6bc9209b4f152fc21e771f5685f796ee4d2" }, "downloads": -1, "filename": "drf-writable-nested-0.5.0.tar.gz", "has_sig": false, "md5_digest": "101b5cba6201011c4ec01e0ea0a0b931", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8979, "upload_time": "2018-08-23T10:11:13", "url": "https://files.pythonhosted.org/packages/c6/8d/9c60d6eda6f22f6d43931143463771abe8addc9da38f4c04acc863535c12/drf-writable-nested-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "85907930e1bf3885fc1241c9cedeca46", "sha256": "5c54eca93d74dc22014fb7ea54b6dbd559a058587596feba4d79078e32a83e16" }, "downloads": -1, "filename": "drf-writable-nested-0.5.1.tar.gz", "has_sig": false, "md5_digest": "85907930e1bf3885fc1241c9cedeca46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9007, "upload_time": "2018-09-17T08:09:19", "url": "https://files.pythonhosted.org/packages/3f/76/aa9fb72cb76d90941bf1ddeb2db35fefaa35d3df9999f8de03806b3722c7/drf-writable-nested-0.5.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "85907930e1bf3885fc1241c9cedeca46", "sha256": "5c54eca93d74dc22014fb7ea54b6dbd559a058587596feba4d79078e32a83e16" }, "downloads": -1, "filename": "drf-writable-nested-0.5.1.tar.gz", "has_sig": false, "md5_digest": "85907930e1bf3885fc1241c9cedeca46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9007, "upload_time": "2018-09-17T08:09:19", "url": "https://files.pythonhosted.org/packages/3f/76/aa9fb72cb76d90941bf1ddeb2db35fefaa35d3df9999f8de03806b3722c7/drf-writable-nested-0.5.1.tar.gz" } ] }