Skip to content

Commit 8616631

Browse files
committed
feat: Add support for LazyReferenceField.
1 parent ae45f07 commit 8616631

File tree

5 files changed

+59
-5
lines changed

5 files changed

+59
-5
lines changed

graphene_mongo/converter.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,20 @@ def dynamic_type():
114114
return Field(_type, description=get_field_description(field, registry))
115115

116116
return Dynamic(dynamic_type)
117+
118+
119+
@convert_mongoengine_field.register(mongoengine.LazyReferenceField)
120+
def convert_lazy_field_to_dynamic(field, registry=None):
121+
model = field.document_type
122+
123+
def lazy_resolver(root, *args, **kwargs):
124+
if getattr(root, field.name or field.db_name):
125+
return getattr(root, field.name or field.db_name).fetch()
126+
127+
def dynamic_type():
128+
_type = registry.get_type_for_model(model)
129+
if not _type:
130+
return None
131+
return Field(_type, resolver=lazy_resolver, description=get_field_description(field, registry))
132+
133+
return Dynamic(dynamic_type)

graphene_mongo/tests/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@
44
)
55
from mongoengine.fields import (
66
DateTimeField, EmailField, EmbeddedDocumentField,
7-
FloatField, EmbeddedDocumentListField, ListField,
7+
FloatField, EmbeddedDocumentListField, ListField, LazyReferenceField,
88
MapField, PointField, ReferenceField, StringField,
99
MultiPolygonField
1010
)
1111

1212
connect('graphene-mongo-test', host='mongomock://localhost', alias='default')
1313

1414

15+
class Publisher(Document):
16+
17+
meta = {'collection': 'test_publisher'}
18+
name = StringField()
19+
20+
1521
class Editor(Document):
1622
"""
1723
An Editor of a publication.
@@ -22,6 +28,7 @@ class Editor(Document):
2228
first_name = StringField(required=True, help_text="Editor's first name.", db_field='fname')
2329
last_name = StringField(required=True, help_text="Editor's last name.")
2430
metadata = MapField(field=StringField(), help_text="Arbitrary metadata.")
31+
company = LazyReferenceField(Publisher)
2532

2633

2734
class Article(Document):

graphene_mongo/tests/test_converter.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from .models import (
1111
Article, Editor, EmbeddedArticle, Player, Reporter,
1212
ProfessorMetadata, ProfessorVector,
13-
)
13+
Publisher)
1414
from .. import registry
1515
from ..converter import convert_mongoengine_field
1616
from ..fields import MongoengineConnectionField
@@ -117,6 +117,23 @@ class Meta:
117117
assert graphene_type.type == E
118118

119119

120+
def test_should_lazy_reference_convert_dynamic():
121+
122+
class P(MongoengineObjectType):
123+
124+
class Meta:
125+
model = Publisher
126+
interfaces = (Node,)
127+
128+
dynamic_field = convert_mongoengine_field(
129+
Editor._fields['company'], P._meta.registry)
130+
131+
assert isinstance(dynamic_field, Dynamic)
132+
graphene_type = dynamic_field.get_type()
133+
assert isinstance(graphene_type, graphene.Field)
134+
assert graphene_type.type == P
135+
136+
120137
def test_should_embedded_convert_dynamic():
121138

122139
class PM(MongoengineObjectType):

graphene_mongo/tests/types.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,14 @@
55
Article, Editor, EmbeddedArticle, Player, Reporter,
66
Parent, Child, ProfessorMetadata, ProfessorVector,
77
ParentWithRelationship, ChildRegisteredBefore,
8-
ChildRegisteredAfter, CellTower
9-
)
8+
ChildRegisteredAfter, CellTower,
9+
Publisher)
10+
11+
12+
class PublisherType(MongoengineObjectType):
13+
14+
class Meta:
15+
model = Publisher
1016

1117

1218
class EditorType(MongoengineObjectType):
@@ -69,6 +75,13 @@ class Meta:
6975
model = ProfessorVector
7076

7177

78+
class PublisherNode(MongoengineObjectType):
79+
80+
class Meta:
81+
model = Publisher
82+
interfaces = (Node,)
83+
84+
7285
class ArticleNode(MongoengineObjectType):
7386

7487
class Meta:

graphene_mongo/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def get_model_reference_fields(model, excluding=None):
2222
attributes = dict()
2323
for attr_name, attr in model._fields.items():
2424
if attr_name in excluding \
25-
or not isinstance(attr, mongoengine.fields.ReferenceField):
25+
or not isinstance(attr, (mongoengine.fields.ReferenceField, mongoengine.fields.LazyReferenceField)):
2626
continue
2727
attributes[attr_name] = attr
2828
return attributes

0 commit comments

Comments
 (0)