docs: def find_or_create_all(cls, list_of_kwargs, keys=[]):
          """Batch method for querying for a list of instances and
          creating them if required
  
          Args:
              list_of_kwargs(list of dicts): A list of dicts where
                  each dict denotes the keyword args that you would pass
                  to the create method separately
  
              keys (list, optional): A list of keys to use for the 
                  initial finding step. Matching is done only on these
                  attributes.
  
          Examples:
  
              >>> Customer.find_or_create_all([
              ... {'name': 'Vicky', 'email': 'vicky@x.com', 'age': 34},
              ... {'name': 'Ron', 'age': 40, 'email': 'ron@x.com',
              ... 'gender': 'Male'}], keys=['name', 'email'])
          """
          list_of_kwargs_wo_dupes, markers = remove_and_mark_duplicate_dicts(
              list_of_kwargs, keys)
          added_objs = cls.add_all([
              cls.first(**subdict(kwargs, keys)) or cls.new(**kwargs)
              for kwargs in list_of_kwargs_wo_dupes])
          result_objs = []
          iterator_of_added_objs = iter(added_objs)
          for idx in range(len(list_of_kwargs)):
              if idx in markers:
                  result_objs.append(added_objs[markers[idx]])
              else:
                  result_objs.append(next(
                      iterator_of_added_objs))
          return result_objs