drf-flex-fields2
Flexible dynamic fields and nested resources for Django REST Framework serializers.
This project is for people building APIs, people integrating them, and people maintaining the ecosystem around them. If you are new to flexible serializers, welcome. If you are evaluating this for production, welcome. If you want to contribute fixes, docs, tests, or ideas, welcome.
Migration from drf-flex-fields
This is a fork of drf-flex-fields developed and maintained by Robert Singer
between 2018 and 2023. For more details on why this fork exists, see
History below. See the Migration Guide
in the documentation for detailed instructions. The short version is:
- Upgrade Django and DRF dependencies, if not done already.
- Install
drf-flex-fields2instead ofdrf-flex-fields. - Fix package name in import paths:
rest_flex_fields2instead ofrest_flex_fields - Change package-level imports to deep imports, e.g.:
from rest_flex_fields2.serializers import FlexFieldsModelSerializer - Rename
REST_FLEX_FIELDStoREST_FLEX_FIELDS2in Django settings.
The drf-flex-fields2 API is stable and compatible with the original drf-flex-fields
package. There are currently no plans to break the existing API. However, if breaking
changes become necessary in the future, they will follow semantic versioning
guidelines and the major version number will be incremented accordingly.
Users, community contributors, and maintainers are warmly welcome to keep this package useful and maintained.
Documentation
The full documentation is published on Read the Docs: https://drf-flex-fields2.readthedocs.io/
Installation
pip install drf-flex-fields2
Quick Example
from rest_flex_fields2.serializers import FlexFieldsModelSerializer
class StateSerializer(FlexFieldsModelSerializer):
class Meta:
model = State
fields = ("id", "name")
class CountrySerializer(FlexFieldsModelSerializer):
class Meta:
model = Country
fields = ("id", "name", "population", "states")
expandable_fields = {
"states": (StateSerializer, {"many": True}),
}
class PersonSerializer(FlexFieldsModelSerializer):
class Meta:
model = Person
fields = ("id", "name", "country", "occupation")
expandable_fields = {
"country": CountrySerializer,
}
Default response:
{
"id": 142,
"name": "Jim Halpert",
"country": 1
}
Expanded response for GET /people/142/?expand=country.states:
{
"id": 142,
"name": "Jim Halpert",
"country": {
"id": 1,
"name": "United States",
"states": [
{
"id": 23,
"name": "Ohio"
},
{
"id": 2,
"name": "Pennsylvania"
}
]
}
}
Highlights
- Expand nested relations with
?expand=. - Limit response payloads with
?fields=and?omit=. - Use dot notation for nested expansion and sparse fieldsets.
- Reuse serializers by passing
expand,fields, andomitdirectly.
License
MIT. See LICENSE.md.
History
The original drf-flex-fields was developed and maintained by Robert Singer
between 2018 and 2023. However, in 2023 maintenance appeared to stop with no
further commits and issues and pull-requests remaining unanswered.
In March 2026, Django REST Framework 3.17.0 removed coreapi support, which unfortunately broke the existing package. Although the immediate fix was simple, the project was due for broader modernization, including tooling updates, Python 2 to 3 cleanup, dependency version maintenance and proper documentation.
This fork exists because drf-flex-fields is used in the
OpenBook project, and we want to
reduce supply-chain risk from outdated dependencies while keeping this
package healthy and maintained. Please join the community and help us with
this mission. Oh, and keep your own packages up to date and maintained, will
you? :-)
Metadata
Release files for drf-flex-fields2 2.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| drf_flex_fields2-2.0.2.tar.gz | 14.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| drf_flex_fields2-2.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.3 kB
Release files / drf_flex_fields2-2.0.2.tar.gz
| Download URL | drf_flex_fields2-2.0.2.tar.gz |
|---|---|
| Size | 14.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
17fdf5ff7b759c1c8c19a2bec0afebf4b9a9ddb715dd7348a902008f9d82391e
|
|
BLAKE2b-256 checksum How to use checksums |
1cbde09f162e2f833716125ff21934a5f71517926ec22402b37ccbbebc95fc33
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 23, 2026.
Transparency logRelease files / drf_flex_fields2-2.0.2-py3-none-any.whl
| Download URL | drf_flex_fields2-2.0.2-py3-none-any.whl |
|---|---|
| Size | 15.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
22893fa7fa6cad4bd59dfb260e663411520b7f84f4d96e70dab805f9b19b9065
|
|
BLAKE2b-256 checksum How to use checksums |
fa8f76a63c574ccaf85404794b9ba7488ab6d4f71cdecf60266244bc1735ddd4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Apr 23, 2026.
Transparency log