Skip to content

Filtering

query(filters=...) accepts either a raw VNDB filter list or a Predicate built from the filter DSL.

Raw filters

The simplest filter is a raw list, exactly as the VNDB API documents it:

client.vn.query(filters=["search", "=", "ever17"])

The filter DSL

Each entity has a filter namespace. Import the ones you need:

from vndb_client.filters import vn_filters, release_filters

Build predicates with comparison operators, and compose them with & (and) and | (or):

from vndb_client import Client
from vndb_client.filters import vn_filters

with Client() as client:
    predicate = (vn_filters.rating >= 80) & (vn_filters.lang == "en")
    page = client.vn.query(filters=predicate, fields="id,title,rating")
    for vn in page.results:
        print(vn.title, vn.rating)

Available namespaces: vn_filters, release_filters, producer_filters, character_filters, staff_filters, tag_filters, trait_filters, quote_filters.

Arbitrary fields

For a field without a namespace attribute, use field:

from vndb_client.filters import field

predicate = field("released") >= "2010-01-01"

Round-tripping compact and normalized filters

VNDB can echo your filters back in two forms — a compact, opaque string and the explicit normalized list. Ask for them with the request flags, then reuse either form as filters in a later query (the compact string cannot be decoded locally; the conversion is done by the API):

from vndb_client import Client
from vndb_client.filters import vn_filters

with Client() as client:
    page = client.vn.query(
        filters=(vn_filters.rating >= 80),
        compact_filters=True,
        normalized_filters=True,
    )
    print(page.compact_filters)     # opaque string
    print(page.normalized_filters)  # explicit nested list

    # Feed either form straight back into another query:
    more = client.vn.query(filters=page.compact_filters, results=25)