DJIANGO NINJIA 数组 查询GET请求

设计到数组的过滤查询,采用这个代码前端出现错误提示:

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

先记录下来,后面空时,再测试代码,排查错误。 如哪位大侠路过,可以帮忙指导一下

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值