GraphQL-like sparse fieldsets and automatic query optimization for Django REST Framework
Project description
drf-partial-response-fields
GraphQL-like sparse fieldsets for Django REST Framework — with automatic
select_related / prefetch_related / only() query optimization, so
requesting fewer fields also means fewer queries and less data transferred.
GET /api/articles/1/?fields=title,author(name,email),tags(label)
{
"title": "Shipping Faster with Sparse Fieldsets",
"author": { "name": "Ada Lovelace", "email": "ada@example.com" },
"tags": [{ "label": "performance" }, { "label": "django" }]
}
Why
Fetching the full representation of a resource is wasteful when a client
only needs a few fields — especially on mobile, in list views, or in
BFF-style aggregation layers. Most "sparse fieldset" implementations for
DRF only filter the serializer output and leave the ORM query untouched,
so you save bytes on the wire but still pay for every join and every
SerializerMethodField query. This package does both: it filters what gets
serialized and rewrites the queryset so the database only does the work
that's actually needed.
Features
- Nested field selection:
?fields=title,author(name,email) - Deep nesting: any depth, e.g.
author(company(name,address(city))) - Exclusion:
?fields=-internal_notes,-legacy_id - Aliasing:
?fields=publishedAt:created_at - Wildcards:
?fields=*(explicit "no restriction") - Works with:
ModelSerializer, nested serializers,SerializerMethodField, pagination,ViewSet/GenericAPIView/APIView, the Browsable API, and OpenAPI schema generation (viadrf-spectacular) - Automatic query optimization:
select_related,prefetch_related(including recursively-optimized nestedPrefetchquerysets), andonly()are derived from the requested fields — seedocs/performance.mdfor measured query-count reductions. - Safe by default: unrequested
SerializerMethodFields are never invoked, so expensive computed fields only cost what they cost when a client actually asks for them. - Fully typed, PEP 561 compatible,
mypy --strictclean.
Installation
pip install drf-partial-response-fields
# with OpenAPI schema support
pip install drf-partial-response-fields[openapi]
Requires Python 3.10+, Django 4.2+, and Django REST Framework 3.14+.
Quick Start
# serializers.py
from rest_framework import serializers
from drf_partial_response_fields import PartialFieldsModelSerializer
class AuthorSerializer(PartialFieldsModelSerializer):
class Meta:
model = Author
fields = ["id", "name", "email"]
class ArticleSerializer(PartialFieldsModelSerializer):
author = AuthorSerializer()
class Meta:
model = Article
fields = ["id", "title", "body", "author"]
# views.py
from rest_framework import viewsets
from drf_partial_response_fields import PartialResponseMixin
class ArticleViewSet(PartialResponseMixin, viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
That's it — GET /articles/?fields=title,author(name) now returns only
title and author.name, and the underlying queryset automatically gets
select_related("author").only("id", "title", "author__id", "author__name").
See docs/quickstart.md and
docs/advanced-usage.md for aliasing, exclusion,
SerializerMethodField optimization hints, and plain-APIView integration.
Documentation
Full documentation is available at https://mahmoudgshake.github.io/MahmoudPackages/drf-partial-response-fields/, including:
- Getting Started
- Installation
- Configuration / Settings
- Quick Start
- Advanced Usage
- Architecture
- API Reference
- Examples
- Common Patterns
- Performance
- Security
- Testing
- Deployment
- FAQ
- Troubleshooting
Contributing
Contributions are welcome — see Contributing.
License
MIT — see LICENSE.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file drf_partial_response_fields-1.0.4.tar.gz.
File metadata
- Download URL: drf_partial_response_fields-1.0.4.tar.gz
- Upload date:
- Size: 54.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e84ad05c3169a44e5216c43defa93355e80e7303faaacffd60f8a63ec7a17aaf
|
|
| MD5 |
bafb6d546be487a2ecfe619f8b2f2ab5
|
|
| BLAKE2b-256 |
b933abc07a66fe9a79e58f079872cfcded815f3bb6c28e45c12107ae44bb0bab
|
File details
Details for the file drf_partial_response_fields-1.0.4-py3-none-any.whl.
File metadata
- Download URL: drf_partial_response_fields-1.0.4-py3-none-any.whl
- Upload date:
- Size: 27.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9edcf11bd5c926b0db5e99046cce6f56b256c3b58f3f2a298b0f47aa785c0f0
|
|
| MD5 |
58ff6de91ebb0f58200ccd108296ca2a
|
|
| BLAKE2b-256 |
a63f62f6bf096b8c3cecc513b7544e8684f8c00841c14465a372680940bb2a66
|