resolve subtypes of postgres RangeField to new RangeType ( with lower and upper field

This commit is contained in:
sprhawk 2019-06-16 15:06:24 +08:00
parent 6e8dce95ae
commit 4015da3b6b
4 changed files with 74 additions and 1 deletions

View File

@ -10,6 +10,12 @@ try:
HStoreField,
JSONField,
RangeField,
DateTimeRangeField,
DateRangeField,
IntegerRangeField,
BigIntegerRangeField,
FloatRangeField,
DecimalRangeField
)
except ImportError:
ArrayField, HStoreField, JSONField, RangeField = (MissingType,) * 4

View File

@ -21,7 +21,26 @@ from graphene.types.json import JSONString
from graphene.utils.str_converters import to_camel_case, to_const
from graphql import assert_valid_name
from .compat import ArrayField, HStoreField, JSONField, RangeField
from .compat import (
ArrayField,
HStoreField,
JSONField,
RangeField,
DateTimeRangeField,
DateRangeField,
IntegerRangeField,
BigIntegerRangeField,
FloatRangeField,
DecimalRangeField
)
from .range_types import (
DateRangeType,
DateTimeRangeType,
IntRangeType,
FloatRangeType
)
from .fields import DjangoListField, DjangoConnectionField
from .utils import import_single_dispatch
@ -236,3 +255,21 @@ def convert_posgres_range_to_string(field, registry=None):
if not isinstance(inner_type, (List, NonNull)):
inner_type = type(inner_type)
return List(inner_type, description=field.help_text, required=not field.null)
@convert_django_field.register(DateTimeRangeField)
def convert_posgres_datetime_range_to_datetime(field, registry=None):
return Field(DateTimeRangeType, description=field.help_text, required=not field.null)
@convert_django_field.register(DateRangeField)
def convert_posgres_date_range_to_date(field, registry=None):
return Field(DateRangeType, description=field.help_text, required=not field.null)
@convert_django_field.register(IntegerRangeField)
@convert_django_field.register(BigIntegerRangeField)
def convert_posgres_int_range_to_int(field, registry=None):
return Field(IntRangeType, description=field.help_text, required=not field.null)
@convert_django_field.register(FloatRangeField)
@convert_django_field.register(DecimalRangeField)
def convert_posgres_float_range_to_float(field, registry=None):
return Field(FloatRangeType, description=field.help_text, required=not field.null)

View File

@ -0,0 +1,29 @@
from graphene import ObjectType
from graphene import (
Float,
Int,
DateTime,
Date
)
class RangeResolver:
def resolve_lower(parent, info):
return parent.lower
def resolve_upper(parent, info):
return parent.upper
class DateTimeRangeType(RangeResolver, ObjectType):
lower = DateTime()
upper = DateTime()
class DateRangeType(RangeResolver, ObjectType):
lower = Date()
upper = Date()
class IntRangeType(RangeResolver, ObjectType):
lower = Int()
upper = Int()
class FloatRangeType(RangeResolver, ObjectType):
lower = Float()
upper = Float()

View File

@ -165,3 +165,4 @@ class DjangoObjectType(ObjectType):
class ErrorType(ObjectType):
field = graphene.String(required=True)
messages = graphene.List(graphene.NonNull(graphene.String), required=True)