Closes #21419: Improve query efficiency for MultipleChoiceFilter (#21421)

* Pass distinct=False to all ModelMultipleChoiceFilters associated with a ForeignKey field

* Pass distinct=False to all MultipleChoiceFilters associated with a concrete model
This commit is contained in:
Jeremy Stretch
2026-02-13 06:31:36 -05:00
committed by GitHub
parent 2330874a8c
commit 1190adde2b
12 changed files with 423 additions and 53 deletions

View File

@@ -22,11 +22,13 @@ __all__ = (
@register_filterset
class WirelessLANGroupFilterSet(NestedGroupModelFilterSet):
parent_id = django_filters.ModelMultipleChoiceFilter(
queryset=WirelessLANGroup.objects.all()
queryset=WirelessLANGroup.objects.all(),
distinct=False,
)
parent = django_filters.ModelMultipleChoiceFilter(
field_name='parent__slug',
queryset=WirelessLANGroup.objects.all(),
distinct=False,
to_field_name='slug'
)
ancestor_id = TreeNodeMultipleChoiceFilter(
@@ -60,20 +62,24 @@ class WirelessLANFilterSet(PrimaryModelFilterSet, ScopedFilterSet, TenancyFilter
to_field_name='slug'
)
status = django_filters.MultipleChoiceFilter(
choices=WirelessLANStatusChoices
choices=WirelessLANStatusChoices,
distinct=False,
)
vlan_id = django_filters.ModelMultipleChoiceFilter(
queryset=VLAN.objects.all()
queryset=VLAN.objects.all(),
distinct=False,
)
interface_id = django_filters.ModelMultipleChoiceFilter(
queryset=Interface.objects.all(),
field_name='interfaces'
)
auth_type = django_filters.MultipleChoiceFilter(
choices=WirelessAuthTypeChoices
choices=WirelessAuthTypeChoices,
distinct=False,
)
auth_cipher = django_filters.MultipleChoiceFilter(
choices=WirelessAuthCipherChoices
choices=WirelessAuthCipherChoices,
distinct=False,
)
class Meta:
@@ -93,19 +99,24 @@ class WirelessLANFilterSet(PrimaryModelFilterSet, ScopedFilterSet, TenancyFilter
@register_filterset
class WirelessLinkFilterSet(PrimaryModelFilterSet, TenancyFilterSet):
interface_a_id = django_filters.ModelMultipleChoiceFilter(
queryset=Interface.objects.all()
queryset=Interface.objects.all(),
distinct=False,
)
interface_b_id = django_filters.ModelMultipleChoiceFilter(
queryset=Interface.objects.all()
queryset=Interface.objects.all(),
distinct=False,
)
status = django_filters.MultipleChoiceFilter(
choices=LinkStatusChoices
choices=LinkStatusChoices,
distinct=False,
)
auth_type = django_filters.MultipleChoiceFilter(
choices=WirelessAuthTypeChoices
choices=WirelessAuthTypeChoices,
distinct=False,
)
auth_cipher = django_filters.MultipleChoiceFilter(
choices=WirelessAuthCipherChoices
choices=WirelessAuthCipherChoices,
distinct=False,
)
class Meta: