def METHOD_NAME(self, value):
    if not isinstance(value, str):
        raise LookupError()
    # Normalize for case-insensitivity
    value = value.lower()
    # Use indexes first
    for key in self.indices:
        try:
            return self.indices[key][value]
        except LookupError:
            pass
    # Use non-indexed values now. Avoid going through indexed values.
    for candidate in self:
        for k in self.no_index:
            v = candidate._fields.get(k)
            if v is None:
                continue
            if v.lower() == value:
                return candidate
    raise LookupError("Could not find a record for %r" % value)