Graphene-Django-Extras add some extra funcionalities to graphene-django to facilitate the graphql use without Relay and allow paginations and filtering integration
Project description
- This package add some extra functionalities to graphene-django to facilitate the graphql use without Relay:
Allows pagination and filtering on Queries.
Allows to define DjangoRestFramework serializers based Mutations.
NOTE: Subscription support was moved to graphene-django-subscriptions due incompatibility with subscriptions on graphene-django>=2.0
Installation:
For installing graphene-django-extras, just run this command in your shell:
pip install "graphene-django-extras"
Documentation:
Extra functionalities:
- Fields:
DjangoObjectField
DjangoFilterListField
DjangoFilterPaginateListField
DjangoListObjectField (Recommended for Queries definition)
- Mutations:
DjangoSerializerMutation (Recommended for Mutations definition)
- Types:
DjangoListObjectType (Recommended for Types definition)
DjangoInputObjectType
DjangoSerializerType (Recommended for quick queries and mutations definitions)
- Paginations:
LimitOffsetGraphqlPagination
PageGraphqlPagination
CursorGraphqlPagination (coming soon)
Queries and Mutations examples:
This is a basic example of graphene-django-extras package use. You can configure global params for DjangoListObjectType classes pagination definitions on settings.py like this:
GRAPHENE_DJANGO_EXTRAS = {
'DEFAULT_PAGINATION_CLASS': 'graphene_django_extras.paginations.LimitOffsetGraphqlPagination',
'DEFAULT_PAGE_SIZE': 20,
'MAX_PAGE_SIZE': 50,
}
1- Types Definition:
from django.contrib.auth.models import User
from graphene_django import DjangoObjectType
from graphene_django_extras import DjangoListObjectType, DjangoSerializerType
from graphene_django_extras.pagination import LimitOffsetGraphqlPagination
from .serializers import UserSerializer
class UserType(DjangoObjectType):
class Meta:
model = User
description = " Type definition for a single user object "
filter_fields = {
'id': ['exact', ],
'first_name': ['icontains', 'iexact'],
'last_name': ['icontains', 'iexact'],
'username': ['icontains', 'iexact'],
'email': ['icontains', 'iexact']
}
class UserListType(DjangoListObjectType):
class Meta:
description = " Type definition for users objects list "
model = User
pagination = LimitOffsetGraphqlPagination()
class UserModelType(DjangoSerializerType):
""" With this type definition it't necessary a mutation definition for models """
class Meta:
description = " User's model type definition "
serializer_class = UserSerializer
pagination = LimitOffsetGraphqlPagination(default_limit=25)
filter_fields = {
'id': ['exact', ],
'first_name': ['icontains', 'iexact'],
'last_name': ['icontains', 'iexact'],
'username': ['icontains', 'iexact'],
'email': ['icontains', 'iexact'],
'is_staff': ['exact']
}
2- You can to define InputTypes for use on mutations:
from graphene_django_extras import DjangoInputObjectType
class UserInput(DjangoInputObjectType):
class Meta:
description = " User InputType definition to use as input on an Arguments class on traditional Mutations "
model = User
3- Defining Mutations:
You can define traditional mutations that use InputTypes or Mutations based on DRF serializers:
import graphene
from .serializers import UserSerializer
from graphene_django_extras import DjangoSerializerMutation
from .types import UserType
from .input_types import UserInputType
class UserSerializerMutation(DjangoSerializerMutation):
"""
DjangoSerializerMutation auto implement Create, Delete and Update functions
"""
class Meta:
description = " DRF serializer based Mutation for Users "
serializer_class = UserSerializer
class UserMutation(graphene.Mutation):
"""
On traditional mutation classes definition you must implement the mutate function
"""
user = graphene.Field(UserType, required=False)
class Arguments:
new_user = graphene.Argument(UserInput)
class Meta:
description = " Graphene traditional mutation for Users "
@classmethod
def mutate(cls, root, info, *args, **kwargs):
...
4- Defining schemes:
import graphene
from graphene_django_extras import DjangoObjectField, DjangoListObjectField, DjangoFilterPaginateListField, DjangoFilterListField, LimitOffsetGraphqlPagination
from .types import UserType, UserListType, UserModelType
from .mutations import UserMutation, UserSerializerMutation
class Queries(graphene.ObjectType):
# Possible User list queries definitions
all_users = DjangoListObjectField(UserListType, description=_('All Users query'))
all_users1 = DjangoFilterPaginateListField(UserType, pagination=LimitOffsetGraphqlPagination())
all_users2 = DjangoFilterListField(UserType)
all_users3 = DjangoListObjectField(UserListType, filterset_class=UserFilter, description=_('All Users query'))
# Defining a query for a single user
# The DjangoObjectField have a ID type input field, that allow filter by id and is't necessary to define resolve function
user = DjangoObjectField(UserType, description=_('Single User query'))
# Another way to define a query to single user
user1 = DjangoObjectField(UserListType.getOne(), description=_('User List with pagination and filtering'))
# Exist two ways to define single or list user queries with DjangoSerializerType
user_retrieve1, user_list1 = UserModelType.QueryFields(description='Some description message for both queries',
deprecation_reason='Some deprecation message for both queries')
user_retrieve2 = UserModelType.RetrieveField(description='Some description message for retrieve query',
deprecation_reason='Some deprecation message for retrieve query')
user_list2 = UserModelType.ListField(description='Some description message for list query',
deprecation_reason='Some deprecation message for list query')
class Mutations(graphene.ObjectType):
user_create = UserSerializerMutation.CreateField(deprecation_reason='Some one deprecation message')
user_delete = UserSerializerMutation.DeleteField()
user_update = UserSerializerMutation.UpdateField()
# Exist two ways to define mutations with DjangoSerializerType
user_create1, user_delete1, user_update1 = UserModelType.MutationFields(
description='Some description message for create, delete and update mutations',
deprecation_reason='Some deprecation message for create, delete and update mutations')
user_create2 = UserModelType.CreateField(description='Description message for create')
user_delete2 = UserModelType.DeleteField(description='Description message for delete')
user_update2 = UserModelType.UpdateField(description='Description message for update')
traditional_user_mutation = UserMutation.Field()
5- Queries’s examples:
{
allUsers(username_Icontains:"john"){
results(limit:5, offset:5){
id
username
firstName
lastName
}
totalCount
}
allUsers1(lastName_Iexact:"Doe", limit:5, offset:0){
id
username
firstName
lastName
}
allUsers2(firstName_Icontains: "J"){
id
username
firstName
lastName
}
user(id:2){
id
username
firstName
}
user1(id:2){
id
username
firstName
}
}
6- Mutations’s examples:
mutation{
userCreate(newUser:{password:"test*123", email: "test@test.com", username:"test"}){
user{
id
username
firstName
lastName
}
ok
errors{
field
messages
}
}
userDelete(id:1){
ok
errors{
field
messages
}
}
userUpdate(newUser:{id:1, username:"John"}){
user{
id
username
}
ok
errors{
field
messages
}
}
}
Change Log:
v0.1.2:
Added ok field and errors field to DjangoSerializerType like on DjangoSerializerMutation.
Added possibility of filtering in those queries fields that return a list of objects.
Updated DRF compatibility.
Fixed bug with filters when use global DEFAULT_PAGINATION_CLASS.
v0.1.1:
Fixed error with JSONField reference on Django==1.8.x installations.
v0.1.0:
Added DjangoSerializerType for quick Django’s models types definition (See documentation).
Moved support for Subscriptions to graphene-django-subscriptions packages for incompatibility with graphene-django>=2.0.
Fixed bug on DjangoFilterPaginateListField’s pagination.
v0.1.0-alpha12:
Added new settings param: MAX_PAGE_SIZE, to use on GRAPHENE_DJANGO_EXTRAS configuration dict for better customize DjangoListObjectType’s pagination.
Added support to Django’s field: GenericRel.
Improve model’s fields calculation for to add all possible related and reverse fields.
Improved documentation translation.
v0.1.0-alpha11:
Improved ordering for showed fields on graphqli’s IDE.
Added better descriptions for auto generated fields.
v0.1.0-alpha10:
Improve converter.py file to avoid create field for auto generate OneToOneField product of an inheritance.
Fixed bug in Emun generation for fields with choices of model inheritance child.
v0.1.0-alpha9:
Fixed bug on GenericType and GenericInputType generations for Queries list Type and Mutations.
v0.1.0-alpha6:
Fixed with exclude fields and converter function.
v0.1.0-alpha5:
Updated to graphene-django>=2.0.
Fixed minor bugs on queryset_builder performance.
v0.1.0-alpha4:
v0.1.0-alpha3:
Fixed bug on subscriptions when not specified any field in “data” parameter to bean return on notification message.
v0.1.0-alpha2:
Fixed bug when subscribing to a given action (create, update pr delete).
Added intuitive and simple web tool to test notifications of graphene-django-extras subscription.
v0.1.0-alpha1:
Added support to multiselect choices values for models.CharField with choices attribute, on queries and mutations. Example: Integration with django-multiselectfield package.
Added support to GenericForeignKey and GenericRelation fields, on queries and mutations.
Added first approach to support Subscriptions with Channels, with subscribe and unsubscribe operations. Using channels-api package.
Fixed minors bugs.
v0.0.4:
Fix error on DateType encode.
v0.0.3:
Implement custom implementation of DateType for use converter and avoid error on Serializer Mutation.
v0.0.2:
Changed dependency of DRF to 3.6.4 on setup.py file, to avoid an import error produced by some changes in new version of DRF=3.7.0 and because DRF 3.7.0 dropped support to Django versions < 1.10.
v0.0.1:
Fixed bug on DjangoInputObjectType class that refer to unused interface attribute.
Added support to create nested objects like in DRF <http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations>, it’s valid to SerializerMutation and DjangoInputObjectType, only is necessary to specify nested_fields=True on its Meta class definition.
Added support to show, only in mutations types to create objects and with debug=True on settings, inputs autocomplete ordered by required fields first.
Fixed others minors bugs.
v0.0.1-rc.2:
Make queries pagination configuration is more friendly.
v0.0.1-rc.1:
Fixed a bug with input fields in the converter function.
v0.0.1-beta.10:
Fixed bug in the queryset_factory function because it did not always return a queryset.
v0.0.1-beta.9:
Remove hard dependence with psycopg2 module.
Fixed bug that prevented use queries with fragments.
Fixed bug relating to custom django_filters module and ordering fields.
v0.0.1-beta.6:
Optimizing imports, fix some minors bugs and working on performance.
v0.0.1-beta.5:
Repair conflict on converter.py, by the use of get_related_model function with: OneToOneRel, ManyToManyRel and ManyToOneRel.
v0.0.1-beta.4:
First commit
Project details
Release history Release notifications | RSS feed
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
Hashes for graphene_django_extras-0.1.2.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 531e62b1f86767d9501c985e692c40302823770675d03803303b5a454e53d567 |
|
MD5 | cc98de24bbab4433141c418229f9a685 |
|
BLAKE2b-256 | 48412adcedacedfb01863d335568c29d9d4e59d56c74d3bf532659f8cd0b61c0 |
Hashes for graphene_django_extras-0.1.2-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5761aed397eaf2789ee0bc92eb771ca214c5a4acc54655ce42939180fc5a29de |
|
MD5 | 970d85d8ad01dd95fd12ab73a63441b2 |
|
BLAKE2b-256 | b416854f0aa63be4736d2de2ccb1b3d60fa585f29328045ef696b0845d6325a3 |