Writable nested helpers for django-rest-framework's serializers
Project description
DRF Writable Nested
This is a writable nested model serializer for Django REST Framework.
Requirements
Python (2.7, 3.2, 3.3, 3.4, 3.5)
Django (1.8, 1.9, 1.10)
djangorestframework (3.x)
Installation
pip install drf-writable-nested
Usage
For example, for the following model structure:
from django.db import models
class Site(models.Model):
url = models.CharField(max_length=100)
class User(models.Model):
username = models.CharField(max_length=100)
class AccessKey(models.Model):
key = models.CharField(max_length=100)
class Profile(models.Model):
sites = models.ManyToManyField(Site)
user = models.OneToOneField(User)
access_key = models.ForeignKey(AccessKey, null=True)
class Avatar(models.Model):
image = models.CharField(max_length=100)
profile = models.ForeignKey(Profile, related_name='avatars')
We should create the following list of serialzers:
from rest_framework import serializers
from drf_writable_nested import WritableNestedModelSerializer
class AvatarSerializer(serializers.ModelSerializer):
image = serializers.CharField()
class Meta:
model = Avatar
fields = ('pk', 'image',)
class SiteSerializer(serializers.ModelSerializer):
url = serializers.CharField()
class Meta:
model = Site
fields = ('pk', 'url',)
class AccessKeySerializer(serializers.ModelSerializer):
class Meta:
model = AccessKey
fields = ('pk', 'key',)
class ProfileSerializer(WritableNestedModelSerializer):
# Direct ManyToMany relation
sites = SiteSerializer(many=True)
# Reverse FK relation
avatars = AvatarSerializer(many=True)
# Direct FK relation
access_key = AccessKeySerializer(allow_null=True)
class Meta:
model = Profile
fields = ('pk', 'sites', 'avatars', 'access_key',)
class UserSerializer(WritableNestedModelSerializer):
# Reverse OneToOne relation
profile = ProfileSerializer()
class Meta:
model = User
fields = ('pk', 'profile', 'username',)
# Optional callback - will be called after reverse relations will be saved
def after_reverse_relations_saved(self, instance):
after_reverse_relations_saved_callback()
# Optional callback - will be called after profile relation will be saved
def after_profile_saved(self):
after_profile_saved_callback()
Also, you can use NestedCreateMixin or NestedUpdateMixin if you want to implement only create or update logic.
For example, if we have /user/ endpoint for user creation with UserSerializer, we should send the following data:
{
"username": "test",
"profile": {
"access_key": {
"key": "key"
},
"sites": [
{
"url": "http://google.com"
},
{
"url": "http://yahoo.com"
}
],
"avatars": [
{
"image": "image-1.png"
},
{
"image": "image-2.png"
}
]
}
}
This serializer automatically will create all relations and we can see the output like the following example:
{
"pk": 1,
"username": "test",
"profile": {
"pk": 1,
"access_key": {
"pk": 1,
"key": "key"
},
"sites": [
{
"pk": 1,
"url": "http://google.com"
},
{
"pk": 2,
"url": "http://yahoo.com"
}
],
"avatars": [
{
"pk": 1,
"image": "image-1.png"
},
{
"pk": 2,
"image": "image-2.png"
}
]
}
}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file drf-writable-nested-0.0.3.tar.gz.
File metadata
- Download URL: drf-writable-nested-0.0.3.tar.gz
- Upload date:
- Size: 7.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b77fa4030db08cfb76c1069f2217a88ed9bee0470106db2a876d06313ce9149c
|
|
| MD5 |
691bf1eb480527116f7a277e2c53bb47
|
|
| BLAKE2b-256 |
ea01ba0ad9f6c001175d50e72f29dc138f68358b34810cfb9b13fc9b170930dc
|