Skip to content

Forced to use relay pagination on list of embedded documents? #162

Open
@BeauGieskens

Description

Suppose I have this document structure:

class PersonModel(EmbeddedDocument):
    name = StringField()

class HouseModel(Document):
    people = ListField(EmbeddedDocumentField(PersonModel))

Then I define my MongoengineObjectTypes:

class Person(MongoengineObjectType):
    class Meta:
        model = PersonModel
        # no interface, since I want to access the people directly

class House(MongoengineObjectType):
    class Meta:
        model = HouseModel
        interfaces = (Node,)

Then I build my schema:

class Query(graphene.ObjectType):
    node = Node.Field()
    houses = MongoengineConnectionField(House)

schema = graphene.Schema(query=Query, types=[House, Person])

This spits out an unfriendly error:

Traceback (most recent call last):
  File "test.py", line 32, in <module>
    schema = graphene.Schema(query=Query, types=[House, Person])
  File "%python39%\lib\site-packages\graphene\types\schema.py", line 78, in __init__
    self.build_typemap()
  File "%python39%\lib\site-packages\graphene\types\schema.py", line 167, in build_typemap
    self._type_map = TypeMap(
  File "%python39%\lib\site-packages\graphene\types\typemap.py", line 80, in __init__
    super(TypeMap, self).__init__(types)
  File "%python39%\lib\site-packages\graphql\type\typemap.py", line 31, in __init__
    self.update(reduce(self.reducer, types, OrderedDict()))  # type: ignore
  File "%python39%\lib\site-packages\graphene\types\typemap.py", line 88, in reducer
    return self.graphene_reducer(map, type)
  File "%python39%\lib\site-packages\graphene\types\typemap.py", line 117, in graphene_reducer
    return GraphQLTypeMap.reducer(map, internal_type)
  File "%python39%\lib\site-packages\graphql\type\typemap.py", line 109, in reducer
    field_map = type_.fields
  File "%python39%\lib\site-packages\graphql\pyutils\cached_property.py", line 22, in __get__
    value = obj.__dict__[self.func.__name__] = self.func(obj)
  File "%python39%\lib\site-packages\graphql\type\definition.py", line 198, in fields
    return define_field_map(self, self._fields)
  File "%python39%\lib\site-packages\graphql\type\definition.py", line 212, in define_field_map
    field_map = field_map()
  File "%python39%\lib\site-packages\graphene\types\typemap.py", line 286, in construct_fields_for_type
    for arg_name, arg in field.args.items():
  File "%python39%\lib\site-packages\graphene_mongo\fields.py", line 68, in args
    return to_arguments(
  File "%python%\lib\site-packages\graphene\types\argument.py", line 80, in to_arguments
    extra_args = sorted(extra_args.items(), key=lambda f: f[1])
TypeError: '<' not supported between instances of 'Person' and 'ID'

But if I add interfaces = (Node,) to the meta of Person the error goes away. However, I am also now forced to paginate through data which I know will also be only a small collection.

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions