|
|
|
|
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",)
|
|
|
|
|
|
|
|
|
|
|