code: def convert_ndb_key_propety(ndb_key_prop, registry=None):
      
      is_repeated = ndb_key_prop._repeated
      name = ndb_key_prop._code_name
  
      if name.endswith('_key') or name.endswith('_keys'):
          # Case #1 - name is of form 'store_key' or 'store_keys'
          string_prop_name = rreplace(name, '_key', '_id', 1)
          resolved_prop_name = name[:-4] if name.endswith('_key') else p.plural(name[:-5])
      else:
          # Case #2 - name is of form 'store'
          singular_name = p.singular_noun(name) if p.singular_noun(name) else name
          string_prop_name = singular_name + '_ids' if is_repeated else singular_name + '_id'
          resolved_prop_name = name
  
      return [
          ConversionResult(name=string_prop_name, field=DynamicNdbKeyStringField(ndb_key_prop, registry=registry)),
          ConversionResult(name=resolved_prop_name, field=DynamicNdbKeyReferenceField(ndb_key_prop, registry=registry))
      ]
docs: Two conventions for handling KeyProperties:
      #1.
          Given:
              store_key = ndb.KeyProperty(...)
  
          Result is 2 fields:
              store_id  = graphene.String() -> resolves to store_key.urlsafe()
              store     = NdbKeyField()     -> resolves to entity
  
      #2.
          Given:
              store = ndb.KeyProperty(...)
  
          Result is 2 fields:
              store_id = graphene.String() -> resolves to store_key.urlsafe()
              store     = NdbKeyField()    -> resolves to entity