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

Error serializing field duration = models.DurationField()?

Ouverte
#150 2 commentaires 4 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Python
Étoiles
372
Forks
175
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

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'"
}
```

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Piste de recherche

Commencez par exécuter le Asset model, le AssetNode schema et la duration query fournis sur l’environnement indiqué afin de reproduire l’erreur. Inspectez graphql/type/scalars.py autour de la ligne 51 et GraphQLScalarType autour de la ligne 65, puis vérifiez que l’interrogation d’un Django DurationField non nul s’achève sans l’erreur de sérialisation datetime.timedelta signalée.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
graphql, postgresql, python
Domaine
api, backend
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.