perf: Add is_alive filter to TerminalFilterSet

pull/16043/head
wangruidong 2025-09-16 15:37:36 +08:00 committed by 老广
parent 7f7a354b2d
commit 953b515817
1 changed files with 13 additions and 0 deletions

View File

@ -2,6 +2,7 @@
# #
import logging import logging
from django.core.cache import cache
from django.db.models import Q from django.db.models import Q
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
@ -27,11 +28,23 @@ logger = logging.getLogger(__file__)
class TerminalFilterSet(BaseFilterSet): class TerminalFilterSet(BaseFilterSet):
name = filters.CharFilter(field_name='name', lookup_expr='icontains') name = filters.CharFilter(field_name='name', lookup_expr='icontains')
remote_addr = filters.CharFilter(field_name='remote_addr', lookup_expr='icontains') remote_addr = filters.CharFilter(field_name='remote_addr', lookup_expr='icontains')
is_alive = filters.BooleanFilter(method='filter_is_alive')
class Meta: class Meta:
model = Terminal model = Terminal
fields = ['name', 'remote_addr', 'type'] fields = ['name', 'remote_addr', 'type']
def filter_is_alive(self, queryset, name, value):
ids = list(queryset.values_list('id', flat=True))
if not ids:
return queryset.none() if value else queryset
alive_ids = [pk for pk in ids if cache.get(Terminal.ALIVE_KEY.format(pk))]
if value:
return queryset.filter(id__in=alive_ids)
else:
return queryset.exclude(id__in=alive_ids)
def filter_queryset(self, queryset): def filter_queryset(self, queryset):
queryset = super().filter_queryset(queryset) queryset = super().filter_queryset(queryset)
search = self.request.query_params.get('search') search = self.request.query_params.get('search')