Repository: graphql-python/graphene-django

Issue:
Convert DecimalField to String rather than Float
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.


Discussion:
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.

Resolving patch:
diff --git a/graphene_django/converter.py b/graphene_django/converter.py
--- a/graphene_django/converter.py
+++ b/graphene_django/converter.py
@@ -18,6 +18,7 @@
     DateTime,
     Date,
     Time,
+    Decimal,
 )
 from graphene.types.json import JSONString
 from graphene.utils.str_converters import to_camel_case
@@ -160,6 +161,10 @@ def convert_field_to_boolean(field, registry=None):
 
 
 @convert_django_field.register(models.DecimalField)
+def convert_field_to_decimal(field, registry=None):
+    return Decimal(description=field.help_text, required=not field.null)
+
+
 @convert_django_field.register(models.FloatField)
 @convert_django_field.register(models.DurationField)
 def convert_field_to_float(field, registry=None):


Test patch:
diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py
--- a/graphene_django/tests/test_converter.py
+++ b/graphene_django/tests/test_converter.py
@@ -242,6 +242,10 @@ def test_should_float_convert_float():
     assert_conversion(models.FloatField, graphene.Float)
 
 
+def test_should_float_convert_decimal():
+    assert_conversion(models.DecimalField, graphene.Decimal)
+
+
 def test_should_manytomany_convert_connectionorlist():
     registry = Registry()
     dynamic_field = convert_django_field(Reporter._meta.local_many_to_many[0], registry)