Skip to main content

Dynamically select only a subset of fields per DRF resource(Support both flat and nested resources)

Project description

django-restql

Latest Version Python Versions License

django-restql is a python library which allows django-rest-framework to dynamically select only a subset of fields per DRF resource(Support both flat and nested resources)

Installing

pip install dictfier

Getting Started

Using django-restql is very simple, you just have to use the DynamicFieldsMixin when defining a serializer.

from rest_framework import serializers
from django.contrib.auth.models import User
from django_restql.mixins import DynamicFieldsMixin

class UserSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'groups')

A regular request returns all fields specified on DRF serializer, in fact django-restql doesn't handle this request at all:

GET /users

    [
      {
        "id": 1,
        "username": "yezyilomo",
        "email": "yezileliilomo@hotmail.com",
        "groups": [1,2]
      },
      ...
    ]

django-restql handle all GET requests with query parameter, this parameter is the one used to pass all fields to be included on a response. For example to select id and username fields from user model, send a request with a query parameter as shown below.

GET /users/?query=["id", "username"]

    [
      {
        "id": 1,
        "username": "yezyilomo"
      },
      ...
    ]

If a query contains nested field, django-restql will return its id or array of ids for the case of nested iterable field(one2many or many2many). For example on a request below location is a flat nested field(many2one) and groups is an iterable nested field(one2many or many2many).

GET /users/?query=["id", "username", "location", "groups"]

    [
      {
        "id": 1,
        "username": "yezyilomo",
        "location": 6,
        "groups": [1,2]
      },
      ...
    ]

With django-restql you can expand or query nested fields at any level. For example you can query a country and region field from location.

GET /users/?query=["id", "username", {"location": ["country", "region"]}]

    [
      {
        "id": 1,
        "username": "yezyilomo",
        "location": {
            "contry": "Tanzania",
            "region": "Dar es salaam"
        }
      },
      ...
    ]

django-restql got your back on expanding or querying iterable nested fields too. For example if you want to expand groups field into id and name, here is how you would do it.

GET /users/?query=["id", "username" {"groups": [[ "id", "name" ]]}]

    [
      {
        "id": 1,
        "username": "yezyilomo",
        "groups": [
            {
                "id": 2,
                "name": "Auth_User"
            }
            {
                "id": 3,
                "name": "Admin_User"
            }
        ]
      },
      ...
    ]

Note:

The notation used to expand flat nested fields is field_name=[sub_field1, sub_field2, ...]

And for iterable nested fields field_name=[[sub_field1, sub_field2, ...]]

For more information on how to create queries you can refer to dictfier which is a library used to implement this project.

Warnings

If the request context does not have access to the request, a warning is emitted:

UserWarning: Context does not have access to request.

First, make sure that you are passing the request to the serializer context

Customizing django-restql

django-restql is very configurable, here is what you can customize

  • Change the name of query parameter.

    If you don't want to use the name query as your parameter, you can inherit DynamicFieldsMixin and change it as shown below

    from django_restql.mixins import DynamicFieldsMixin
    
    class MyDynamicFieldMixin(DynamicFieldsMixin):
        query_param_name = "your_favourite_name"
    

    Now you can use this Mixin on your serializers and use the name your_favourite_name as your parameter. E.g

    GET /users/?your_favourite_name=["id", "username"]

  • Customize how django-restql serialize flat fields, nested flat fields and nested iterable fields.

    You can do this by inheriting DynamicFieldsMixin and override flat_field, nested_flat_field and nested_iter_field methods as shown below.

    from django_restql.mixins import DynamicFieldsMixin
    
    class MyDynamicFieldMixin(DynamicFieldsMixin):
        def flat_field(self, field_value, parent_field, field_name):
            # Your customization here
            return flat_field_value
    
        def nested_flat_field(self, field_value, parent_field, field_name):
            # Your customization here
            return flat_field_value
    
        def nested_iter_field(self, field_value, parent_field, field_name):
            # Your customization here
            return flat_field_value
    

    Note: To be able to do this you must understand how django-restql is implemented, specifically DynamicFieldsMixin class, you can check it here.

Credits

This implementation is based on dictfier library and the idea behind GraphQL.

My intention is to extend the capability of drf-dynamic-fields library to support more functionalities like allowing to query nested fields both flat and iterable.

Contributing PRs Welcome

We welcome all contributions. Please read our CONTRIBUTING.md first. You can submit any ideas as pull requests or as GitHub issues. If you'd like to improve code, check out the Code Style Guide and have a good time!.

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-restql-0.1.1.tar.gz (4.4 kB view details)

Uploaded Source

Built Distribution

django_restql-0.1.1-py3-none-any.whl (5.2 kB view details)

Uploaded Python 3

File details

Details for the file django-restql-0.1.1.tar.gz.

File metadata

  • Download URL: django-restql-0.1.1.tar.gz
  • Upload date:
  • Size: 4.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.11.1 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.6.7

File hashes

Hashes for django-restql-0.1.1.tar.gz
Algorithm Hash digest
SHA256 107034402623968106a7c0595ead5de49ecbfb60b881bcd4568a15fd18fcc714
MD5 74ce54e4a29662f161d48858d39f6356
BLAKE2b-256 85392b0dec93d5a4797fff35495d7599f51cfc7e01568083a839d6fa6f070eef

See more details on using hashes here.

File details

Details for the file django_restql-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: django_restql-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 5.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.11.1 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.6.7

File hashes

Hashes for django_restql-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f490c49af209924537946e5ab2644c4a9a3d51a8bf865987ddcff7c183bcb457
MD5 72c3a7f143876627edb6cb93b6408f44
BLAKE2b-256 43448f0d5df5e0a2c5eafad5f66b5b7c071a0f89292c3db9fbabf38eff3e5ebf

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