Using Django and GraphQL to manage money and finances? Check out graphene-djmoney
At Uplift, we work a lot with Django and GraphQL, and rely heavily on graphene. Sometimes you need to work with money and currencies, and for this, it's hard to beat the Django integration offered by django-money.
We wanted a nice way to handle GraphQL APIs for these Money types too, and wrote an open source library for it.
GraphQL Money types for Django using graphene and django-money (djmoney). If you use
django-money, this library is for you.
You get automatic resolvers for
MoneyField model fields:
from django.conf import settings from django.db import models from djmoney.models.fields import MoneyField class Product(models.Model): # ... other fields ... cost = MoneyField( max_digits=settings.CURRENCY_MAX_DIGITS, decimal_places=settings.CURRENCY_DECIMAL_PLACES, default_currency=settings.BASE_CURRENCY, null=True, blank=True, )
Then your graphene GraphQL product type:
import graphene from graphene_django import DjangoObjectType from yourapp import models class Product(DjangoObjectType): class Meta: model = models.Product interfaces = (graphene.relay.Node,) fields = ("id", "cost")
So that's really handy for querying. If you have custom properties on your models that return
Money, you can easily declare the type on the graphene object and the resolver will Just Work (tm):
And lastly, to handle money as GraphQL input, it provides a
MoneyInput type, which has a convenient
.money method to access the input as a
import graphene from graphene_djmoney.schema import MoneyInput from .. import models from .types import Product class UpdateProduct(graphene.Mutation): class Arguments: id = graphene.ID(required=True) cost = MoneyInput(required=True) success = graphene.Boolean(required=True) product = graphene.Field(Product) def mutate(root, info, id, cost): models.Product.objects.filter(id=id).update( cost=cost.money, ) product = models.Product.objects.get(id=id) return UpdateProduct(product=product, success=True)
For more details, check out the
test_app in the GitHub repository. If you have any trouble or suggestions for improvement, feel free to open an issue.
To install and use this, it's available on pypi:
pip install graphene-djmoney
Thanks for reading and enjoy!