Fields¶
Graphene-Django-Extras provides several field types for building GraphQL schemas with enhanced functionality.
DjangoObjectField¶
Used for single object queries with automatic ID filtering.
from graphene_django_extras import DjangoObjectField
from .types import UserType
class Query(graphene.ObjectType):
user = DjangoObjectField(UserType, description='Single User query')
Features: - Automatic ID-based filtering - No need to define custom resolve function - Built-in error handling for non-existent objects
Usage in GraphQL:
DjangoFilterListField¶
Provides filtering capabilities for list queries without pagination.
from graphene_django_extras import DjangoFilterListField
from .types import UserType
class Query(graphene.ObjectType):
users = DjangoFilterListField(UserType)
Features: - Django-filter integration - Multiple filter types (exact, contains, etc.) - No pagination (returns all matching results)
Usage in GraphQL:
DjangoFilterPaginateListField¶
Combines filtering and pagination for list queries.
from graphene_django_extras import DjangoFilterPaginateListField
from graphene_django_extras.paginations import LimitOffsetGraphqlPagination
from .types import UserType
class Query(graphene.ObjectType):
users = DjangoFilterPaginateListField(
UserType,
pagination=LimitOffsetGraphqlPagination(default_limit=20)
)
Features: - All filtering capabilities of DjangoFilterListField - Built-in pagination support - Configurable pagination class
Usage in GraphQL:
{
users(firstName_Icontains: "john", limit: 10, offset: 0) {
results {
id
username
firstName
}
totalCount
}
}
DjangoListObjectField¶
Recommended for Queries
This is the most flexible approach for list queries with built-in support for filtering and pagination.
from graphene_django_extras import DjangoListObjectField
from .types import UserListType
class Query(graphene.ObjectType):
users = DjangoListObjectField(UserListType, description='All Users query')
Features: - Works with DjangoListObjectType - Inherits pagination configuration from the type - Support for custom FilterSet classes - Built-in caching support
Usage in GraphQL:
With Custom FilterSet¶
import django_filters
from django.contrib.auth.models import User
class UserFilter(django_filters.FilterSet):
name = django_filters.CharFilter(method='filter_by_name')
class Meta:
model = User
fields = ['username', 'email']
def filter_by_name(self, queryset, name, value):
return queryset.filter(
Q(first_name__icontains=value) | Q(last_name__icontains=value)
)
class Query(graphene.ObjectType):
users = DjangoListObjectField(
UserListType,
filterset_class=UserFilter,
description='Users with custom filtering'
)
Field Comparison¶
Feature | DjangoObjectField | DjangoFilterListField | DjangoFilterPaginateListField | DjangoListObjectField |
---|---|---|---|---|
Single Objects | ✅ | ❌ | ❌ | ❌ |
List Objects | ❌ | ✅ | ✅ | ✅ |
Filtering | ID only | ✅ | ✅ | ✅ |
Pagination | ❌ | ❌ | ✅ | ✅ |
Custom FilterSet | ❌ | ✅ | ✅ | ✅ |
Type Integration | Basic | Basic | Basic | Full |
Caching | ❌ | ❌ | ❌ | ✅ |
Best Practices¶
1. Use DjangoListObjectField for Lists¶
# ✅ Recommended
class Query(graphene.ObjectType):
users = DjangoListObjectField(UserListType, description='All users')
# ❌ Less flexible
class Query(graphene.ObjectType):
users = DjangoFilterPaginateListField(UserType)
2. Define Filter Fields in Types¶
class UserType(DjangoObjectType):
class Meta:
model = User
filter_fields = {
"username": ("exact", "icontains"),
"email": ("exact", "icontains"),
"is_active": ("exact",),
}
3. Use Descriptive Names¶
class Query(graphene.ObjectType):
# ✅ Clear and descriptive
active_users = DjangoListObjectField(
UserListType,
description='List of active users with pagination'
)
user_by_id = DjangoObjectField(
UserType,
description='Get a single user by ID'
)
4. Combine with Permissions¶
from graphene_django_extras import DjangoListObjectField
class Query(graphene.ObjectType):
users = DjangoListObjectField(UserListType)
def resolve_users(self, info, **kwargs):
if not info.context.user.is_staff:
raise PermissionError("Staff access required")
return super().resolve_users(info, **kwargs)