diff --git a/program/filters.py b/program/filters.py
index ea43ff7b96be4c83ed482e99fdf5c831f0f341a0..8478b6f9baca2d7c92b9d4127f47c50b86df1d99 100644
--- a/program/filters.py
+++ b/program/filters.py
@@ -3,7 +3,7 @@ import datetime
 from django_filters import rest_framework as filters
 from django_filters import widgets
 
-from django.contrib.auth.models import User
+from django import forms
 from django.db.models import Q, QuerySet
 from django.utils import timezone
 from program import models
@@ -19,7 +19,7 @@ class StaticFilterHelpTextMixin:
         return _filter
 
 
-class ModelMultipleChoiceFilter(filters.ModelMultipleChoiceFilter):
+class IntegerInFilter(filters.BaseInFilter):
     class QueryArrayWidget(widgets.QueryArrayWidget):
         # see: https://github.com/carltongibson/django-filter/issues/1047
         def value_from_datadict(self, data, files, name):
@@ -31,17 +31,12 @@ class ModelMultipleChoiceFilter(filters.ModelMultipleChoiceFilter):
                     new_data[key] = data.getlist(key)
             return super().value_from_datadict(new_data, files, name)
 
+    field_class = forms.IntegerField
+
     def __init__(self, *args, **kwargs):
         kwargs.setdefault("widget", self.QueryArrayWidget())
-        kwargs["lookup_expr"] = "in"
         super().__init__(*args, **kwargs)
 
-    def get_filter_predicate(self, v):
-        # There is something wrong with using ModelMultipleChoiceFilter
-        # along the CSVWidget that causes lookups to fail.
-        # May be related to: https://github.com/carltongibson/django-filter/issues/1103
-        return super().get_filter_predicate([v.pk])
-
 
 class ShowFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
     active = filters.BooleanFilter(
@@ -52,34 +47,31 @@ class ShowFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
             "or past or upcoming shows if false."
         ),
     )
-    host = ModelMultipleChoiceFilter(
-        queryset=models.Host.objects.all(),
+    host = IntegerInFilter(
         field_name="hosts",
         help_text="Return only shows assigned to the given host(s).",
     )
     # TODO: replace `musicfocus` with `music_focus` when dashboard is updated
-    musicfocus = ModelMultipleChoiceFilter(
-        queryset=models.MusicFocus.objects.all(),
+    musicfocus = IntegerInFilter(
         field_name="music_focus",
         help_text="Return only shows with given music focus(es).",
     )
-    owner = ModelMultipleChoiceFilter(
-        queryset=User.objects.all(),
+    owner = IntegerInFilter(
         field_name="owners",
         help_text="Return only shows that belong to the given owner(s).",
     )
-    category = ModelMultipleChoiceFilter(
-        queryset=models.Category.objects.all(),
+    category = IntegerInFilter(
         help_text="Return only shows of the given category or categories.",
     )
-    language = ModelMultipleChoiceFilter(
-        queryset=models.Language.objects.all(),
+    language = IntegerInFilter(
         help_text="Return only shows of the given language(s).",
     )
-    topic = ModelMultipleChoiceFilter(
-        queryset=models.Topic.objects.all(),
+    topic = IntegerInFilter(
         help_text="Return only shows of the given topic(s).",
     )
+    type = IntegerInFilter(
+        help_text="Return only shows of a given type.",
+    )
     public = filters.BooleanFilter(
         field_name="is_public",
         help_text="Return only shows that are public/non-public.",
@@ -113,9 +105,6 @@ class ShowFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
 
     class Meta:
         model = models.Show
-        help_texts = {
-            "type": "Return only shows of a given type.",
-        }
         fields = [
             "active",
             "category",
@@ -224,14 +213,12 @@ class TimeSlotFilterSet(filters.FilterSet):
 
 
 class NoteFilterSet(StaticFilterHelpTextMixin, filters.FilterSet):
-    ids = ModelMultipleChoiceFilter(
+    ids = IntegerInFilter(
         field_name="id",
-        queryset=models.Note.objects.all(),
         help_text="Return only notes matching the specified id(s).",
     )
-    owner = ModelMultipleChoiceFilter(
+    owner = IntegerInFilter(
         field_name="show__owners",
-        queryset=models.User.objects.all(),
         help_text="Return only notes by show the specified owner(s): all notes the user may edit.",
     )