relaygraphene-python

Custom ConnectionField in graphene


I'm not understanding how to use custom fields in a ConnectionField in graphene. I have something like:

class ShipConnection(Connection):
    extra = String()

    class Meta:
        node = Ship

SHIPS = ['Tug boat', 'Row boat', 'Canoe']

class Query(AbstractType):
    ships = relay.ConnectionField(ShipConnection)

    def resolve_ships(self, args, context, info):
        return ShipConnection(
            extra='Some extra text',
            edges=???
        )

Normally, you'd say:

    def resolve_ships(self, args, context, info):
        return SHIPS

but how do you return something in extra and return a list?


Solution

  • The proper way to do this is exactly explained here.

    class Ship(graphene.ObjectType):
        ship_type = String()
    
        def resolve_ship_type(self, info):
             return self.ship_type
    
        class Meta:
              interfaces = (Node,)
    
    class ShipConnection(Connection):
        total_count = Int() # i've found count on connections very useful! 
    
        def resolve_total_count(self, info):
            return get_count_of_all_ships()
    
        class Meta:
            node = Ship
    
        class Edge:
            other = String()
            def resolve_other(self, info):
                return "This is other: " + self.node.other
    
    class Query(graphene.ObjectType):
        ships = relay.ConnectionField(ShipConnection)
    
        def resolve_ships(self, info):
            return get_list_of_ships_from_database_or_something_idk_its_your_implmentation()
    
    schema = graphene.Schema(query=Query)
    

    I don't know if this is recommended, but the resolve_total_count method can also be implemented as:

    def resolve_total_count(self, info):
        return len(self.iterable)
    

    I don't know if the iterable property is documented anywhere, but I was able to find it while investigating the Connection class