A Graphene-Django (GraphQL) queries and mutations generator
- Generate queries and mutations based on the specified model(s)
- Require authentication for some and/or all generated queries/mutations
Graphene-Generator uses a number of open source projects to work properly:
- Django - a Python-based web framework,
- Graphene-Django - A Django integration for Graphene.
If you are not familiar with the above technologies, please refer to their respective documentation.
And of course Graphene-generator itself is open source with a public repository on GitHub.
For installing graphene, just run this command in your shell:
pip install "graphene-generator"
We need to specify the model(s) name to be used and their respective path(s)
GRAPHENE_GENERATOR_MODELS = [
{
'name': 'modelname', # eg: ingredient
'path': 'path.to.the.model',
}
]
Note that GRAPHENE_GENERATOR_MODELS
is an array to support many models at once.
If we want to require the authentication, we need to specify that in our settings under the require_auth
dictionary for each model
GRAPHENE_GENERATOR_MODELS = [
{
# ...
'require_auth': {
'queries': ["all", "single"],
'mutations': ["create", 'update', 'delete']
}
}
]
To make the difference between Mutations and Queries the require_auth
contains queries
and mutations
as different keys.
Below are the different values and their meaning:
Key word | Meaning |
---|---|
all |
The get all query (usually the model['name'] + s ) |
single |
The get one query (usually the model['name'] ) |
Key word | Meaning |
---|---|
create |
The create mutation |
update |
The update mutation |
delete |
The delete mutation |
We need to import the QueriesHolder
and/or MutationsHolder
classes into our schema used by graphene and you should be able to see the generated CRUD operations into you schema.
Here is a simple Django model:
from django.db import models
class Ingredient(models.Model):
name = models.CharField(max_length=100)
notes = models.TextField()
Based on the above model ou settings would look like:
GRAPHENE_GENERATOR_MODELS = [
{
'name': 'ingredient',
'path': 'ingredients.models.Ingredient',
'require_auth': {
'queries': ["all", "single"],
'mutations': ["create", 'update', 'delete']
}
}
]
Here is a graphene schema sample which use the generated requests:
import graphene
from graphene_generator.holder import QueriesHolder, MutationsHolder
class Query(QueriesHolder, graphene.ObjectType):
pass
class Mutation(MutationsHolder, graphene.ObjectType):
pass
schema = graphene.Schema(query=Query, mutation=MutationsHolder)
Then you can query the schema:
query = '''
query {
ingredients {
name,
notes
}
}
'''
result = schema.execute(query)
- Write Tests
- Handle model's relations properly
- Use corresponding graphene scalar type for each field(currently using string for all fields)
- Handle pagination
MIT