filter_by query helper that handles soft delete logic. If your query conditions require expressions, use read.

        :param removed: whether to include soft-deleted rows
        :param kwargs: where clause mappings to pass to filter_by
        :return: row object generator

def read_by(cls, removed=False, **kwargs):
        """
        filter_by query helper that handles soft delete logic. If your query conditions require expressions, use read.

        :param removed: whether to include soft-deleted rows
        :param kwargs: where clause mappings to pass to filter_by
        :return: row object generator
        """
        if not removed:
            kwargs['time_removed'] = 0
        return cls.query.filter_by(**kwargs)