Skip to content

Commit f9ad081

Browse files
Yahir AmatYahir Amat
Yahir Amat
authored and
Yahir Amat
committed
Added hybrid method
1 parent d9388e9 commit f9ad081

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

graphene_sqlalchemy/converter.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,10 @@ def dynamic_type():
4848
return Field(List(_type))
4949

5050
return Dynamic(dynamic_type)
51-
51+
52+
def convert_sqlalchemy_hybrid_method(hybrid_item):
53+
return String(description=getattr(hybrid_item, '__doc__', None),
54+
required=False)
5255

5356
def convert_sqlalchemy_composite(composite, registry):
5457
converter = registry.get_converter_for_composite(composite.composite_class)

graphene_sqlalchemy/types.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import six
44
from sqlalchemy.inspection import inspect as sqlalchemyinspect
5+
from sqlalchemy.ext.hybrid import hybrid_property
56
from sqlalchemy.orm.exc import NoResultFound
67

78
from graphene import Field, ObjectType
@@ -13,7 +14,8 @@
1314

1415
from .converter import (convert_sqlalchemy_column,
1516
convert_sqlalchemy_composite,
16-
convert_sqlalchemy_relationship)
17+
convert_sqlalchemy_relationship,
18+
convert_sqlalchemy_hybrid_method)
1719
from .registry import Registry, get_global_registry
1820
from .utils import get_query, is_mapped
1921

@@ -47,6 +49,24 @@ def construct_fields(options):
4749
converted_composite = convert_sqlalchemy_composite(composite, options.registry)
4850
fields[name] = converted_composite
4951

52+
for hybrid_item in inspected_model.all_orm_descriptors:
53+
54+
if type(hybrid_item) == hybrid_property:
55+
name = hybrid_item.__name__
56+
57+
is_not_in_only = only_fields and name not in only_fields
58+
is_already_created = name in options.fields
59+
is_excluded = name in exclude_fields or is_already_created
60+
61+
if is_not_in_only or is_excluded:
62+
# We skip this field if we specify only_fields and is not
63+
# in there. Or when we excldue this field in exclude_fields
64+
65+
continue
66+
converted_hybrid_property = convert_sqlalchemy_hybrid_method(
67+
hybrid_item)
68+
fields[name] = converted_hybrid_property
69+
5070
# Get all the columns for the relationships on the model
5171
for relationship in inspected_model.relationships:
5272
is_not_in_only = only_fields and relationship.key not in only_fields

0 commit comments

Comments
 (0)