DecimalField entries are currently being converted to Float (https://github.com/graphql-python/graphene-django/blob/8f5a425859ea380d0640c441c5c7f3b1acae17b4/graphene_django/form_converter.py#L56-L59)
Full support for Decimal would be great, but in the meantime I propose that DecimalField should be converted to String instead. Once you've converted a Decimal to a Float, you've probably lost the benefit of why you used Decimal in the first place, since you'll now have values like 3.14000000000000012, rather than 3.14. If it is converted to String, it is simple enough for the user to convert that String back to Decimal, whereas converting from Float to Decimal is not straightforward.
As a workaround for this particular problem, I created a Decimal type, and then am explicitly setting that field in the DjangoObjectType class. For example, I created a Decimal type like this
import decimal
from graphene.types import Scalar
from graphql.language import ast
class Decimal(Scalar):
"""
The `Decimal` scalar type represents a python Decimal.
"""
@staticmethod
def serialize(dec):
assert isinstance(dec, decimal.Decimal), (
'Received not compatible Decimal "{}"'.format(repr(dec))
)
return str(dec)
@staticmethod
def parse_value(value):
return decimal.Decimal(value)
@classmethod
def parse_literal(cls, node):
if isinstance(node, ast.StringValue):
return cls.parse_value(node.value)
and then explicitly replace the field like this:
class MyModelType(DjangoObjectType):
my_decimal_field = Decimal()
class Meta:
model = MyModel
assuming that I have a Django model _MyModel_ with Decimal field _my_decimal_field_.
Decimal type landed in graphene: https://github.com/graphql-python/graphene/issues/703
Edit: Appears it isn't released yet but is merged, need graphene>2.1.3
Yeah, I finally got around to adding my Decimal type into graphene. It should be possible to fix graphene-django's implementation of DecimalField after the next release of graphene to actually use a Decimal, and it won't be necessary to convert to a String (as per the title of this issue). Note that the JSON output is implemented as string though.
Brilliant, thank you @picturedots!
@gsvr I didn't make the graphene-django change that you noted in form_converter.py above, so not sure if this is issue should be closed. Without that change, it looks like Decimals are still explicitly converted to floats.
Waiting on this feature as well.
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.
@gsvr @jkimbo Is this still relevant?
The issue is still relevant. We talked with @jkimbo about how to fix it. My work will be on https://github.com/graphql-python/graphene-django/pull/958 and i hope to complete in next couple days.
Thanks @ulgens
I agree that it's still relevant - I've used a workaround in the meantime but this would be a good general improvement imho
Is this still relevant? If so, what is blocking it? Is there anything you can do to help move it forward?
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.
Thanks to everyone who contributed to resolving this! 馃憦 馃憦
Most helpful comment
As a workaround for this particular problem, I created a Decimal type, and then am explicitly setting that field in the DjangoObjectType class. For example, I created a Decimal type like this
and then explicitly replace the field like this:
assuming that I have a Django model _MyModel_ with Decimal field _my_decimal_field_.