import datetime from rest_framework import serializers from django_filters.rest_framework import FilterSet import django_filters from app.models import TP import logging logger = logging.getLogger('mylogger') class SerialMyModel(serializers.ModelSerializer): class Meta: model = TP fields = "__all__" class SerialFilter(FilterSet): """ 过滤器,支持模糊查询 record_time,日期时间格式,如 2023-01-01 00:00:00 police_id,支持模糊匹配 event_type,支持模糊匹配 """ record_time = django_filters.DateTimeFilter(field_name='record_time', lookup_expr='icontains') police_id = django_filters.CharFilter(field_name='police_id', lookup_expr='icontains') event_type = django_filters.CharFilter(field_name='event_type', lookup_expr='icontains') # 记录时间范围查询 start_time = django_filters.DateTimeFilter(field_name='record_time', lookup_expr='gte') # end_time = django_filters.DateTimeFilter(field_name='record_time', lookup_expr='lte') end_time = django_filters.DateTimeFilter(field_name='record_time', method='time_range_filter') # todo bug: start_time 和 end_time同一天的情况 done violation = django_filters.NumberFilter(field_name='is_violation', method='is_violation_query') violation_type = django_filters.CharFilter(field_name='ai_analysis', lookup_expr='icontains') def time_range_filter(self, queryset, name, value): """ @params queryset: 为TP.objects.all()返回的合集, 即视图类中的的queryset @params name: 为field_name @params value: 为前端通过end_time字段传过来的值 """ return queryset.filter(record_time__lte=value + datetime.timedelta(days=1)) def is_violation_query(self, queryset, name, value): if value == 2: return queryset elif value == 1: return queryset.filter(is_violation=True) elif value == 0: return queryset.filter(is_violation=False) else: return queryset.filter(is_violation=True) class Meta: # 指定模型 models = TP # 指定需要模糊查询的字段 fields = ("record_time", "police_id", "event_type", "ai_analysis",)