{"id":6351,"library":"drf-writable-nested","title":"DRF Writable Nested","description":"drf-writable-nested provides helpers for django-rest-framework (DRF) serializers, enabling creation and update of nested objects in a single API call. It simplifies handling related fields, especially for one-to-many and many-to-many relationships, making nested serializer operations more intuitive. The current version is 0.7.2, and it maintains an active release cadence, frequently updating for new Django, DRF, and Python versions.","status":"active","version":"0.7.2","language":"en","source_language":"en","source_url":"https://github.com/beda-software/drf-writable-nested","tags":["django","drf","serializers","nested","api"],"install":[{"cmd":"pip install drf-writable-nested","lang":"bash","label":"Install stable version"}],"dependencies":[{"reason":"Required for any Django project, powers the ORM and models.","package":"django","optional":false},{"reason":"Core dependency for DRF serializers and views, drf-writable-nested extends its functionality.","package":"djangorestframework","optional":false}],"imports":[{"symbol":"WritableNestedModelSerializer","correct":"from drf_writable_nested.serializers import WritableNestedModelSerializer"},{"symbol":"UniqueFieldsMixin","correct":"from drf_writable_nested.mixins import UniqueFieldsMixin"}],"quickstart":{"code":"from django.db import models\nfrom rest_framework import serializers\nfrom drf_writable_nested.serializers import WritableNestedModelSerializer\n\n# Define models\nclass Planet(models.Model):\n    name = models.CharField(max_length=100, unique=True)\n    population = models.BigIntegerField(default=0)\n\n    def __str__(self):\n        return self.name\n\nclass Moon(models.Model):\n    name = models.CharField(max_length=100, unique=True)\n    planet = models.ForeignKey(Planet, on_delete=models.CASCADE, related_name='moons')\n\n    def __str__(self):\n        return self.name\n\n# Define nested serializer for Moon\nclass MoonSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = Moon\n        fields = ['id', 'name']\n\n# Define main serializer for Planet using WritableNestedModelSerializer\nclass PlanetSerializer(WritableNestedModelSerializer):\n    moons = MoonSerializer(many=True, required=False)\n\n    class Meta:\n        model = Planet\n        fields = ['id', 'name', 'population', 'moons']\n\n# Example usage (requires Django setup, e.g., via manage.py shell)\n# p = Planet.objects.create(name='Earth', population=8000000000)\n# m = Moon.objects.create(name='Luna', planet=p)\n# print(PlanetSerializer(p).data)\n\n# Create a new planet with moons\n# data = {\n#     'name': 'Mars',\n#     'population': 0,\n#     'moons': [\n#         {'name': 'Phobos'},\n#         {'name': 'Deimos'}\n#     ]\n# }\n# serializer = PlanetSerializer(data=data)\n# serializer.is_valid(raise_exception=True)\n# new_planet = serializer.save()\n# print(new_planet.name, new_planet.moons.all())\n\n# Update an existing planet and its moons\n# existing_earth = Planet.objects.get(name='Earth')\n# update_data = {\n#     'population': 8100000000,\n#     'moons': [\n#         {'id': Moon.objects.get(name='Luna').id, 'name': 'The Moon'},\n#         {'name': 'New Moon'}\n#     ]\n# }\n# serializer = PlanetSerializer(existing_earth, data=update_data, partial=True)\n# serializer.is_valid(raise_exception=True)\n# updated_planet = serializer.save()\n# print(updated_planet.name, updated_planet.moons.all())\n","lang":"python","description":"This quickstart demonstrates how to use `WritableNestedModelSerializer` to create and update a `Planet` object along with its associated `Moon` objects. It defines `Planet` and `Moon` models, then sets up a `MoonSerializer` and a `PlanetSerializer`. By including `MoonSerializer` as a nested field in `PlanetSerializer` and inheriting from `WritableNestedModelSerializer`, you can perform atomic create/update operations for both parent and child objects with a single serializer. Uncomment the example usage lines to test within a Django shell environment."},"warnings":[{"fix":"Ensure your project runs on Python 3.9+ (3.12+ recommended), Django 4.2+, and DRF 3.14+ to use drf-writable-nested v0.7.x. Review your `requirements.txt` and upgrade dependencies.","message":"Version 0.7.2 dropped support for Python 3.8. Additionally, version 0.7.1 dropped support for Python <3.7, Django <4.2, and DRF <3.14.","severity":"breaking","affected_versions":"0.7.1, 0.7.2"},{"fix":"If precise `SET(fn)` behavior is critical for related object deletions in nested updates, consider handling the deletion logic explicitly in your view or using a different `on_delete` strategy (e.g., `SET_NULL`, `SET_DEFAULT`) that `drf-writable-nested` fully supports, or implement custom logic in the serializer's `update`/`create` methods.","message":"Nested object deletion with `on_delete=SET(fn)` is not fully supported; related objects might still be deleted as they were in previous releases, rather than having their foreign keys set by the function.","severity":"gotcha","affected_versions":"0.7.0 and later"}],"env_vars":null,"last_verified":"2026-04-15T00:00:00.000Z","next_check":"2026-07-14T00:00:00.000Z"}