|
8 | 8 | from extras.filters import CustomFieldFilterSet, CreatedUpdatedFilterSet
|
9 | 9 | from tenancy.filters import TenancyFilterSet
|
10 | 10 | from utilities.filters import (
|
11 |
| - MultiValueCharFilter, NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter, |
| 11 | + MultiValueCharFilter, MultiValueNumberFilter, NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter, |
12 | 12 | )
|
13 | 13 | from virtualization.models import VirtualMachine
|
14 | 14 | from .choices import *
|
@@ -304,15 +304,14 @@ class IPAddressFilterSet(TenancyFilterSet, CustomFieldFilterSet, CreatedUpdatedF
|
304 | 304 | to_field_name='rd',
|
305 | 305 | label='VRF (RD)',
|
306 | 306 | )
|
307 |
| - device = django_filters.ModelMultipleChoiceFilter( |
308 |
| - field_name='interface__device__name', |
309 |
| - queryset=Device.objects.all(), |
310 |
| - to_field_name='name', |
| 307 | + device = MultiValueCharFilter( |
| 308 | + method='filter_device', |
| 309 | + field_name='name', |
311 | 310 | label='Device (name)',
|
312 | 311 | )
|
313 |
| - device_id = django_filters.ModelMultipleChoiceFilter( |
314 |
| - field_name='interface__device', |
315 |
| - queryset=Device.objects.all(), |
| 312 | + device_id = MultiValueNumberFilter( |
| 313 | + method='filter_device', |
| 314 | + field_name='pk', |
316 | 315 | label='Device (ID)',
|
317 | 316 | )
|
318 | 317 | virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
|
@@ -386,8 +385,10 @@ def filter_mask_length(self, queryset, name, value):
|
386 | 385 |
|
387 | 386 | def filter_device(self, queryset, name, value):
|
388 | 387 | try:
|
389 |
| - device = Device.objects.prefetch_related('device_type').get(**{name: value}) |
390 |
| - vc_interface_ids = [i['id'] for i in device.vc_interfaces.values('id')] |
| 388 | + devices = Device.objects.prefetch_related('device_type').filter(**{'{}__in'.format(name): value}) |
| 389 | + vc_interface_ids = [] |
| 390 | + for device in devices: |
| 391 | + vc_interface_ids.extend([i['id'] for i in device.vc_interfaces.values('id')]) |
391 | 392 | return queryset.filter(interface_id__in=vc_interface_ids)
|
392 | 393 | except Device.DoesNotExist:
|
393 | 394 | return queryset.none()
|
|
0 commit comments