|
1 | 1 | from collections import OrderedDict
|
2 | 2 |
|
3 | 3 | from sqlalchemy.inspection import inspect as sqlalchemyinspect
|
| 4 | +from sqlalchemy.ext.hybrid import hybrid_property |
4 | 5 | from sqlalchemy.orm.exc import NoResultFound
|
5 | 6 |
|
6 | 7 | from graphene import Field # , annotate, ResolveInfo
|
|
10 | 11 |
|
11 | 12 | from .converter import (convert_sqlalchemy_column,
|
12 | 13 | convert_sqlalchemy_composite,
|
13 |
| - convert_sqlalchemy_relationship) |
| 14 | + convert_sqlalchemy_relationship, |
| 15 | + convert_sqlalchemy_hybrid_method) |
14 | 16 | from .registry import Registry, get_global_registry
|
15 | 17 | from .utils import get_query, is_mapped
|
16 | 18 |
|
@@ -42,6 +44,24 @@ def construct_fields(model, registry, only_fields, exclude_fields):
|
42 | 44 | converted_composite = convert_sqlalchemy_composite(composite, registry)
|
43 | 45 | fields[name] = converted_composite
|
44 | 46 |
|
| 47 | + for hybrid_item in inspected_model.all_orm_descriptors: |
| 48 | + |
| 49 | + if type(hybrid_item) == hybrid_property: |
| 50 | + name = hybrid_item.__name__ |
| 51 | + |
| 52 | + is_not_in_only = only_fields and name not in only_fields |
| 53 | + is_already_created = name in options.fields |
| 54 | + is_excluded = name in exclude_fields or is_already_created |
| 55 | + |
| 56 | + if is_not_in_only or is_excluded: |
| 57 | + # We skip this field if we specify only_fields and is not |
| 58 | + # in there. Or when we excldue this field in exclude_fields |
| 59 | + |
| 60 | + continue |
| 61 | + converted_hybrid_property = convert_sqlalchemy_hybrid_method( |
| 62 | + hybrid_item) |
| 63 | + fields[name] = converted_hybrid_property |
| 64 | + |
45 | 65 | # Get all the columns for the relationships on the model
|
46 | 66 | for relationship in inspected_model.relationships:
|
47 | 67 | is_not_in_only = only_fields and relationship.key not in only_fields
|
|
0 commit comments