Skip to main content
`Ctrl`+`K`

# Flexible Field Types

If your plugin uses flexible fields to store numbers or other non-string values, you can specify the types of those fields. A rating plugin, for example, might want to declare that the `rating` field should have an integer type:

    from beets.plugins import BeetsPlugin
    from beets.dbcore import types

    class RatingPlugin(BeetsPlugin):
        item_types = {"rating": types.INTEGER}

        @property
        def album_types(self):
            return {"rating": types.INTEGER}

A plugin may define two attributes: `item_types` and `album_types`. Each of those attributes is a dictionary mapping a flexible field name to a type instance. You can find the built-in types in the `beets.dbcore.types` and `beets.library` modules or implement your own type by inheriting from the `Type` class.

Specifying types has several advantages:

- Code that accesses the field like `item['my_field']` gets the right type (instead of just a string).

- You can use advanced queries (like ranges) from the command line.

- User input for flexible fields may be validated and converted.

- Items missing the given field can use an appropriate null value for querying and sorting purposes.