adding restriction of your api's return fields, in restframework
Project description
adding restriction of your api’s return fields, in restframework.
what is this?
The api is defined, such as below.
request: GET /users/1/?format=json status code: 200 response: { "id": 1, "url": "http://testserver/users/1/?format=json", "username": "foo", "email": "", "is_staff": false, "skills": [ { "id": 1, "user": 1, "name": "magic" }, { "id": 2, "user": 1, "name": "magik" } ] }
If you passing return_fields option, api’s response is filtered.
request: GET /users/1/?format=json&return_fields=username,id status code: 200 response: { "id": 1, "username": "foo" }
And adding skip__fields option, treated as ignored fields.
request: GET /users/1/?format=json&return_fields=username,skills&skip_fields=skills__id,skills__user status code: 200 response: { "username": "foo", "skills": [ { "name": "magic" }, { "name": "magik" } ] }
how to use it?
using django_returnfields.serializer_factory
from rest_framework import viewsets
from django_returnfields import serializer_factory
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = serializer_factory(UserSerializer)
appendix
if you requesting with aggressive option, then, django_returnfields tries to use Query.defer() or Query.only(). e.g.
GET /users/1/?format=json&return_fields=username,skills&skip_fields=skills__id,skills__user&aggressive=1
aggressive option is not only using defer and only, but also semi-automatic join or prefetching (TODO: introduction)
example
## models
from django.db import models
from django.contrib.auth.models import User
class Skill(models.Model):
name = models.CharField(max_length=255, default="", null=False)
user = models.ForeignKey(User, null=False, related_name="skills")
## serializers
from rest_framework import serializers
class SkillSerializer(serializers.ModelSerializer):
class Meta:
model = Skill
fields = ('id', 'user', 'name')
class UserSerializer(serializers.ModelSerializer):
skills = SkillSerializer(many=True, read_only=True)
class Meta:
model = User
fields = ('id', 'url', 'username', 'email', 'is_staff', 'skills')
## viewsets
from rest_framework import viewsets
from django_returnfields import serializer_factory
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = serializer_factory(UserSerializer)
class SkillViewSet(viewsets.ModelViewSet):
queryset = Skill.objects.all()
serializer_class = serializer_factory(SkillSerializer)
## routes
router = routers.DefaultRouter()
router.register(r'users', viewsets.UserViewSet)
router.register(r'skills', viewsets.SkillViewSet)
urlpatterns = [
url(r'^api/', include(router.urls)),
]
0.3.2
simplify
bug fix, a optimization is not worked with a serializer has many=False option.
0.3.1
supporting source option of django restframework’s field
0.3
rewriting aggressive implementation.
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
Built Distribution
File details
Details for the file django-returnfields-0.3.2.tar.gz
.
File metadata
- Download URL: django-returnfields-0.3.2.tar.gz
- Upload date:
- Size: 9.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9ffedc1338c2fd23cecdeb99e35d39a639705647922e8f5385b76c0307b8e356 |
|
MD5 | df41931430ff23e83f377a8cf6edc69e |
|
BLAKE2b-256 | cc9178445f02464f3d70c34e6cac3145fcdb873816c7717e12c827e6d0fa3a80 |
File details
Details for the file django_returnfields-0.3.2-py3-none-any.whl
.
File metadata
- Download URL: django_returnfields-0.3.2-py3-none-any.whl
- Upload date:
- Size: 12.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0cd3ce6604204d657b550152642f4a6c774ba15318d8a5b8f1457a2d5beeb619 |
|
MD5 | bbadaceb2499a87d783bfd9cd72ad1cf |
|
BLAKE2b-256 | 9d77536a061fca61b2d0b265cb6a3796815b1be204ddaab9c8e8613df8fa4b1e |