django-icv-taxonomy is built around two ideas: a vocabulary, which is a named set of terms with a type (flat, hierarchical, or faceted), and a term, which anything in your project can be tagged with through a generic association. The facet bar on the main demo page is one vocabulary; each button is one term.
Filtering by a term is a real query, get_objects_for_term(), against the association table joining terms to tagged objects; it is not a hand-rolled tag match against a text field. Selecting more than one facet ANDs the results together, so a package must carry every selected term to appear.
Terms can also relate to each other, independent of the objects they tag: broader, narrower, and related rows, in the SKOS vocabulary tradition. The term detail panel on the main demo page reads those relationships directly with get_related_terms(), so a facet vocabulary can express structure a flat tag list cannot.