graphql-python / graphql-python/graphql-core-legacy

Error serializing field duration = models.DurationField()?

Offen
#150 2 Kommentare 4 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Python
Sterne
372
Forks
175
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

Hi there, i'm not 100% sure if this is a bug or not (I'm newbee here) but i got a problem while querying a Node that uses the field type models.DurationField ( it really returns datetime.timedelta).

```
Traceback (most recent call last):
File "/tmp/leaky_venv/lib/python3.6/site-packages/promise/promise.py", line 65, in try_catch
return (handler(*args, **kwargs), None)
File "/tmp/leaky_venv/lib/python3.6/site-packages/graphql/execution/executor.py", line 375, in
resolved
File "/tmp/leaky_venv/lib/python3.6/site-packages/graphql/execution/executor.py", line 399, in complete_value
return complete_leaf_value(return_type, result)
File "/tmp/leaky_venv/lib/python3.6/site-packages/graphql/execution/executor.py", line 440, in complete_leaf_value
return return_type.serialize(result)
File "/tmp/leaky_venv/lib/python3.6/site-packages/graphql/type/scalars.py", line 51, in coerce_float
return float(value)
TypeError: float() argument must be a string or a number, not 'datetime.timedelta'
```

This error points to line 51 but i think the class GraphQLScalarType (on line 65) is also related.

Here is my env's prop
```
PostgreSQL 10.0 on x86_64-pc-linux-gnu (xubuntu 16.04), compiled by gcc (Debian 6.3.0-18) 6.3.0 20170516, 64-bit

Python == 3.6.1

Django==1.11.6
django-filter==1.1.0
graphene==2.0
graphene-django==2.0.0
graphql-core==2.0
graphql-relay==0.4.5
```
How to reproduce?

1- Create your model
```
class Asset(models.Model):
duration = models.DurationField(null=True, blank=True, help_text="Duration of a given offer/product (auto calculated)")

class Meta:
ordering = ["id"]
```

2-Create your schema
```
class AssetNode(DjangoObjectType):

class Meta:
model = Asset
interfaces = (relay.Node, )
```
3- insert a not-null value on the duration field... and run your query.

```
{assets(first:20,) {
edges {
node {
id
duration
}
}
}}
```

and you should que the error:
```
{
"message": "float() argument must be a string or a number, not 'datetime.timedelta'"
}
```

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Führen Sie zunächst das bereitgestellte Asset model, AssetNode schema und die duration query gegen die angegebene Umgebung aus, um den Fehler zu reproduzieren. Untersuchen Sie graphql/type/scalars.py um Zeile 51 und GraphQLScalarType um Zeile 65. Überprüfen Sie anschließend, dass das Abfragen eines nicht nullbaren Django DurationField ohne den gemeldeten datetime.timedelta-Serialisierungsfehler abgeschlossen wird.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
graphql, postgresql, python
Bereich
api, backend
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.