Dynamic Fields

The Dynamic Fields feature allows you to select which fields should be included in your serializer input/output at runtime. This provides flexibility to create different views of your data without creating multiple serializer classes.

Basic Usage

To specify which fields to include, pass a fields parameter when instantiating your serializer:

serializer = AuthorProfileSerializer(
    instance=author,
    fields=['bio', 'website']
)

This will only include the bio and website fields in the output.

Field Selection Types

List of Fields

fields=['id', 'title', 'created_at']

Tuple of Fields

fields=('id', 'title', 'status')

Set of Fields

fields={'username', 'email', 'last_login'}

Behavior Notes

  • Non-existent fields are silently ignored

  • Write-only fields are never included in output (even if specified)

  • The field selection applies to both top-level and nested serializers

Common Patterns

API Versioning

Show different fields for different API versions:

def get_serializer_fields(version):
    if version == 'v1':
        return ['id', 'title', 'content']
    elif version == 'v2':
        return ['id', 'title', 'excerpt', 'author']
    return '__all__'

fields = get_serializer_fields(request.version)
serializer = PostSerializer(post, fields=fields)

Client-Specific Views

Customize output for different client types:

def get_client_fields(client_type):
    base_fields = ['id', 'title']
    if client_type == 'mobile':
        return base_fields + ['excerpt']
    elif client_type == 'web':
        return base_fields + ['content', 'related_posts']
    return base_fields

fields = get_client_fields(request.client_type)
serializer = PostSerializer(post, fields=fields)

Nested Field Control

Control fields for nested relationships:

serializer = BlogPostSerializer(
    instance=post,
    fields=['id', 'title', 'author'],
    nested={
        'author': {
            'serializer': AuthorSerializer,
            'fields': ['name', 'avatar']
        }
    }
)

Examples

Combining with Other Features

Dynamic fields work well with other serializer features:

serializer = BlogPostSerializer(
    post,
    fields=['id', 'title', 'author'],
    rename_fields={'id': 'post_id'},
    conditional_fields={
        'stats': lambda i, c: c['request'].user.is_staff
    }
)

Field Presets

Create reusable field configurations:

POST_FIELD_PRESETS = {
    'list': ['id', 'title', 'excerpt'],
    'detail': ['id', 'title', 'content', 'author', 'categories'],
    'admin': '__all__'
}

# Usage
serializer = PostSerializer(
    post,
    fields=POST_FIELD_PRESETS['detail']
)

Error Handling

  • Invalid field containers (e.g., strings instead of lists) raise DynamicSerializerConfigError

  • The serializer will ignore: - Non-existent fields - Write-only fields (even if requested)

See Also