设计到数组的过滤查询,采用这个代码前端出现错误提示:
class Filters(FuFilters): work_order_number: int = Field(None, alias='work_order_number') work_order_type: int = Field(None, alias='work_order_type') is_chargeable: int = Field(None, alias='is_chargeable') machine_sn__machine_sn: int = Field(None, alias='machine_sn') machine_type__type__icontains: str = Field(None, alias='machine_type') customer_name__name__icontains: str = Field(None, alias='customer_name') urgency_level: int = Field(None, alias='urgency_level') dispatch: List[int] = Field(default_factory=list, alias='dispatch[:]')
@api.get("/", response=List[ServiceOrderOut]) # 也可以实现模糊搜索,前面加了name__contains解析
# @paginate(MyPagination)
def list_service_order(request, filters: Filters = Query(...)):
print("Filters:", filters)
print("Dispatch 参数:", filters.dispatch)
# 使用 retrieve 方法获取初始的 queryset
qs = retrieve(request, ServiceOrder, filters)
print(f"Queryset: {qs}")
# 检查并应用 dispatch 过滤条件
if filters.dispatch and len(filters.dispatch) > 0:
qs = qs.filter(dispatch__id__in=filters.dispatch)
# 转换 queryset 为输出格式
result = [ServiceOrderOut.from_orm(order) for order in qs]
for r in result:
print(f"Result item: {r}")
return result
Field 'id' expected a number but got [].
后端打印的信息
ilters: creator_id=None belong_dept=None belong_dept__in=None work_order_number=None work_order_type=None is_chargeable=None machine_sn__machine_sn=None machine_type__type__icontains=None customer_name__name__icontains=None urgency_level=None dispatch=[] status=None completion_date=None start_settlement_date=None completion_settlement_date=None report_time=None
Dispatch 参数: []
[2024-07-08 18:13:15][django.server.log_message():187] [INFO] "GET /api/service/service_order/?page=1&pageSize=10&_t=1720433595042?_t=1720433595042 HTTP/1.1" 200 99
[2024-07-08 18:13:15][django.server.log_message():187] [INFO] "GET /api/system/user?post_code[:]=1&_t=1720433595113 HTTP/1.1" 200 5226
修改代码:
@api.get("/", response=List[ServiceOrderOut])
def list_service_order(request, filters: Filters = Query(...)):
print("Filters:", filters)
print("Dispatch 参数:", filters.dispatch)
qs = ServiceOrder.objects.all()
if filters.work_order_number:
qs = qs.filter(work_order_number=filters.work_order_number)
if filters.work_order_type:
qs = qs.filter(work_order_type=filters.work_order_type)
if filters.is_chargeable:
qs = qs.filter(is_chargeable=filters.is_chargeable)
if filters.machine_sn__machine_sn:
qs = qs.filter(machine_sn__machine_sn=filters.machine_sn__machine_sn)
if filters.machine_type__type__icontains:
qs = qs.filter(machine_type__type__icontains=filters.machine_type__type__icontains)
if filters.customer_name__name__icontains:
qs = qs.filter(customer_name__name__icontains=filters.customer_name__name__icontains)
if filters.urgency_level:
qs = qs.filter(urgency_level=filters.urgency_level)
if filters.dispatch:
qs = qs.filter(dispatch__id__in=filters.dispatch)
if filters.status:
qs = qs.filter(status=filters.status)
if filters.completion_date:
qs = qs.filter(completion_date=filters.completion_date)
if filters.start_settlement_date:
qs = qs.filter(start_settlement_date=filters.start_settlement_date)
if filters.completion_settlement_date:
qs = qs.filter(completion_settlement_date=filters.completion_settlement_date)
if filters.report_time:
qs = qs.filter(report_time=filters.report_time)
result = [ServiceOrderOut.from_orm(order) for order in qs]
for r in result:
print(f"Result item: {r}")
return result
前端运行正常,可以正常搜索:
后端打印的信息:
Filters: creator_id=None belong_dept=None belong_dept__in=None work_order_number=None work_order_type=None is_chargeable=None machine_sn__machine_sn=None machine_type__type__icontains=None customer_name__name__icontains=None urgency_level=None dispatch=[] status=None completion_date=None start_settlement_date=None completion_settlement_date=None report_time=None
Dispatch 参数: []
Result item: id=14 remark=None creator=None modifier=None belong_dept=None update_datetime=datetime.datetime(2024, 7, 7, 16, 56, 15, 344833) create_datetime=datetime.datetime(2024, 7, 7, 16, 56, 15, 344833) sort=1 work_order_number='20240707007' work_order_type=2 work_content='110' report_time=datetime.datetime(2024, 7, 7, 16, 56, 15, 344833) warranty=2 is_chargeable=1 machine_sn=MachineBankOut(id=20, sn='665343') machine_type=MachineDataOut(id=11, type='SH550') customer_name=CustomerOut(id=10, name='stringde') urgency_level=1 planned_start_date=datetime.date(2024, 7, 30) status=1 completion_date=None start_settlement_date=None completion_settlement_date=None dispatch=[UserOut(id=32, name='A')]
Result item: id=13 remark=None creator=None modifier=None belong_dept=None update_datetime=datetime.datetime(2024, 7, 7, 16, 50, 31, 791331) create_datetime=datetime.datetime(2024, 7, 7, 16, 50, 31, 791331) sort=1 work_order_number='20240707006' work_order_type=4 work_content='111' report_time=datetime.datetime(2024, 7, 7, 16, 50, 31, 791331) warranty=2 is_chargeable=1 machine_sn=MachineBankOut(id=1, sn='665310') machine_type=MachineDataOut(id=15, type='V5') customer_name=CustomerOut(id=2, name='上海西门子') urgency_level=1 planned_start_date=datetime.date(2024, 7, 17) status=1 completion_date=None start_settlement_date=None completion_settlement_date=None dispatch=[UserOut(id=15, name='王五')]
Result item: id=12 remark=None creator=None modifier=None belong_dept=None update_datetime=datetime.datetime(2024, 7, 7, 16, 43, 56, 154423) create_datetime=datetime.datetime(2024, 7, 7, 16, 43, 56, 154423) sort=1 work_order_number='20240707005' work_order_type=2 work_content='113' report_time=datetime.datetime(2024, 7, 7, 16, 43, 56, 154423) warranty=2 is_chargeable=1 machine_sn=MachineBankOut(id=1, sn='665310') machine_type=MachineDataOut(id=15, type='V5') customer_name=CustomerOut(id=2, name='上海西门子') urgency_level=1 planned_start_date=datetime.date(1970, 8, 23) status=1 completion_date=None start_settlement_date=None completion_settlement_date=None dispatch=[UserOut(id=15, name='王五'), UserOut(id=13, name='王强'), UserOut(id=8, name='孙竹')]
Result item: id=11 remark=None creator=None modifier=None belong_dept=None update_datetime=datetime.datetime(2024, 7, 7, 16, 28, 30, 45564) create_datetime=datetime.datetime(2024, 7, 7, 16, 28, 30, 45564) sort=1 work_order_number='20240707004' work_order_type=2 work_content='115' report_time=datetime.datetime(2024, 7, 7, 16, 28, 30, 45564) warranty=2 is_chargeable=1 machine_sn=MachineBankOut(id=1, sn='665310') machine_type=MachineDataOut(id=15, type='V5') customer_name=CustomerOut(id=2, name='上海西门子') urgency_level=1 planned_start_date=datetime.date(1970, 8, 23) status=1 completion_date=None start_settlement_date=None completion_settlement_date=None dispatch=[UserOut(id=13, name='王强'), UserOut(id=6, name='蔡武')]
Result item: id=10 remark=None creator=None modifier=None belong_dept=None update_datetime=datetime.datetime(2024, 7, 7, 16, 28, 1, 293290) create_datetime=datetime.datetime(2024, 7, 7, 16, 28, 1, 293290) sort=1 work_order_number='20240707003' work_order_type=2 work_content='113' report_time=datetime.datetime(2024, 7, 7, 16, 28, 1, 293290) warranty=2 is_chargeable=1 machine_sn=MachineBankOut(id=20, sn='665343') machine_type=MachineDataOut(id=11, type='SH550') customer_name=CustomerOut(id=10, name='stringde') urgency_level=1 planned_start_date=datetime.date(1970, 8, 23) status=1 completion_date=None start_settlement_date=None completion_settlement_date=None dispatch=[UserOut(id=15, name='王五')]
Result item: id=8 remark=None creator=None modifier=None belong_dept=None update_datetime=datetime.datetime(2024, 7, 7, 11, 45, 9, 255492) create_datetime=datetime.datetime(2024, 7, 7, 11, 45, 9, 255492) sort=1 work_order_number='20240707002' work_order_type=2 work_content='112' report_time=datetime.datetime(2024, 7, 7, 11, 45, 9, 255492) warranty=2 is_chargeable=1 machine_sn=MachineBankOut(id=1, sn='665310') machine_type=MachineDataOut(id=15, type='V5') customer_name=CustomerOut(id=2, name='上海西门子') urgency_level=1 planned_start_date=datetime.date(1970, 8, 23) status=1 completion_date=None start_settlement_date=None completion_settlement_date=None dispatch=[UserOut(id=6, name='蔡武')]
[2024-07-08 18:19:16][django.server.log_message():187] [INFO] "GET /api/service/service_order/?page=1&pageSize=10&_t=1720433956142?_t=1720433956142 HTTP/1.1" 200 4408
还没有仔细参考两个的差别,空时查看这个差别,第一个应该可以修改好。
这个代码太复杂了,好多重复。采用 filter_conditions
字典来存储所有的过滤条件,然后使用一个循环来动态地应用这些过滤条件。想减少代码的重复性,如果以后需要添加新的过滤条件,只需在字典中添加相应的键值对即可合并了一下:
@api.get("/", response=List[ServiceOrderOut])
def list_service_order(request, filters: Filters = Query(...)):
print("Filters:", filters)
print("Dispatch 参数:", filters.dispatch)
qs = ServiceOrder.objects.all()
filter_conditions = {
'work_order_number': filters.work_order_number,
'work_order_type': filters.work_order_type,
'is_chargeable': filters.is_chargeable,
'machine_sn__machine_sn': filters.machine_sn__machine_sn,
'machine_type__type__icontains': filters.machine_type__type__icontains,
'customer_name__name__icontains': filters.customer_name__name__icontains,
'urgency_level': filters.urgency_level,
'dispatch__id__in': filters.dispatch,
'status': filters.status,
'completion_date': filters.completion_date,
'start_settlement_date': filters.start_settlement_date,
'completion_settlement_date': filters.completion_settlement_date,
'report_time': filters.report_time
}
for field, value in filter_conditions.items():
if value is not None:
qs = qs.filter(**{field: value})
result = [ServiceOrderOut.from_orm(order) for order in qs]
for r in result:
print(f"Result item: {r}")
return result
刷新,也出现报错:
Filters: creator_id=None belong_dept=None belong_dept__in=None work_order_number=None work_order_type=None is_chargeable=None machine_sn__machine_sn=None machine_type__type__icontains=None customer_name__name__icontains=None urgency_level=None dispatch=[] status=None completion_date=None start_settlement_date=None completion_settlement_date=None report_time=None
Dispatch 参数: []
[2024-07-08 18:22:39][django.server.log_message():187] [INFO] "GET /api/service/service_order/?page=1&pageSize=10&_t=1720434159226?_t=1720434159226 HTTP/1.1" 200 67
[2024-07-08 18:22:39][django.server.log_message():187] [INFO] "GET /api/system/user?post_code[:]=1&_t=1720434159333 HTTP/1.1" 200 5226
先记录下来,后面空时,再测试代码,排查错误。 如哪位大侠路过,可以帮忙指导一下