Skip to main content

adding restriction of your api's return fields, in restframework

Project description

https://travis-ci.org/podhmo/django-returnfields.svg

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-returnfields-0.3.2.tar.gz (9.2 kB view details)

Uploaded Source

Built Distribution

django_returnfields-0.3.2-py3-none-any.whl (12.5 kB view details)

Uploaded Python 3

File details

Details for the file django-returnfields-0.3.2.tar.gz.

File metadata

File hashes

Hashes for django-returnfields-0.3.2.tar.gz
Algorithm Hash digest
SHA256 9ffedc1338c2fd23cecdeb99e35d39a639705647922e8f5385b76c0307b8e356
MD5 df41931430ff23e83f377a8cf6edc69e
BLAKE2b-256 cc9178445f02464f3d70c34e6cac3145fcdb873816c7717e12c827e6d0fa3a80

See more details on using hashes here.

File details

Details for the file django_returnfields-0.3.2-py3-none-any.whl.

File metadata

File hashes

Hashes for django_returnfields-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 0cd3ce6604204d657b550152642f4a6c774ba15318d8a5b8f1457a2d5beeb619
MD5 bbadaceb2499a87d783bfd9cd72ad1cf
BLAKE2b-256 9d77536a061fca61b2d0b265cb6a3796815b1be204ddaab9c8e8613df8fa4b1e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page