docs: def get(cls, id=None, condition=None, fields=None, cache=False, engine_name=None, **kwargs):
          """
          Get object from Model, if given fields, then only fields will be loaded
          into object, other properties will be Lazy
          
          if cache is True or defined __cacheable__=True in Model class, it'll use cache first
          """
          
          if id is None and condition is None:
              return None
          
          can_cacheable = (cache or getattr(cls, '__cacheable__', None)) and \
              isinstance(id, (int, long, str, unicode))
          if can_cacheable:
              #send 'get_object' topic to get cached object
              obj = dispatch.get(cls, 'get_object', id)
              if obj:
                  return obj
  
          if condition is not None:
              _cond = condition
          else:
              if is_condition(id):
                  _cond = id
              else:
                  _cond = cls.c[cls._primary_field] == id
              #todo
              # if isinstance(id, (int, long)):
              #     _cond = cls.c.id==id
              # elif isinstance(id, (str, unicode)) and id.isdigit():
              #     _cond = cls.c.id==int(id)
              # else:
              #     _cond = id
  
          #if there is no cached object, then just fetch from database
          obj = cls.filter(_cond, **kwargs).fields(*(fields or [])).one()
          
          if obj and cache or getattr(cls, '__cacheable__', None):
              dispatch.call(cls, 'set_object', instance=obj)
  
          return obj