django 对复杂的get请求参数的处理,请教

对get 请求的参数进行处理,下面的方法可以用但感觉有些low
问题,请教更合理的方式:
1,为了让后端区分是 模糊查询还是全等查询,    我把请前端参数写成:  查询字段名={val:'...',equal:'False'}, 请教有什么更合理的办法
2, 因为veiws函数中 一般 只有一个get, 我又要区分是查询列表,还是查询一条数据, 又增加一个参数 type=list 让后端区别处理 


# 后端对request.query_params 参数进行处理的函数
def getCondition(query_params):
    # 前端get参数格式: { type:'list'|'single, 字段名:{val:string,equal:boolean} }
    # query_params: request.query_params
    # 过滤条件的参数
    condition = {}
   # 排序条件的参数
    order_by =[]
    # 排除不需要处理的参数
    exclude = ['page','page_size','limit','offset','type','order_by']

    if query_params.get('type') == 'list': # 判断查询是一条还是多条
        for param in query_params:
            # 排序参数,参端转过来的格式是:order_by='-name,update_time,...'
            if param == 'order_by':
                order_by = query_params.get(param).split(',')
                continue
            if param in exclude: 
                continue # 排除 type 参数

            #把  参数{ val:string, equal: boolean } 的字符串,转为dict格式
            obj = json.loads(query_params.get(param).replace("'", "\""))
            if not obj['equal']:
                condition[param +'__contains'] = obj['val']
            else:
                condition[param] = obj['val']
    # 如果只查询一条记录
    else:
        for param in query_params:
            if param in exclude: continue # 排除 type 参数
            condition[param] = query_params[param]
    print('sssssssssssssssssssssssssssssss',condition, order_by)
    return condition, order_by

该回答引用GPTᴼᴾᴱᴺᴬᴵ
针对您提出的两个问题,我提供以下建议:

  1. 更合理的处理模糊查询和全等查询的方法
    您可以考虑使用两个不同的参数来区分模糊查询和全等查询,例如:
  • 查询字段名={val:'...',match:'exact'}
  • 查询字段名={val:'...',match:'contains'}

其中,match参数的值为exact时表示全等查询,为contains时表示模糊查询。这样做的好处是能够更清晰地表达查询的意图,并且不需要将查询条件的字符串进行处理。

  1. 更合理的区分查询列表和查询单条数据的方法
    您可以使用两个不同的视图函数来处理查询列表和查询单条数据的请求,例如:
  • 查询列表的视图函数使用GET方法,不需要传递id等唯一标识符,可以根据条件查询多条记录,并返回一个列表。
  • 查询单条数据的视图函数使用GET方法,需要传递id等唯一标识符,可以根据id查询一条记录,并返回一个对象。

这样做的好处是能够更好地区分两种不同类型的请求,并且可以使代码更加清晰易读。

以上是我的建议,希望对您有所帮助。

参考GPT和自己的思路:

对于问题1,如果想让后端区分模糊查询和全等查询,建议前端把请求参数写成:查询字段名={val:'...',operator:'like'}或查询字段名={val:'...',operator:'='}等格式,其中operator表示操作符,即查询符号。后端可以根据operator的值来判断是模糊查询还是全等查询。

对于问题2,建议通过URL的结构来区分查询列表和查询一条数据。比如,查询列表可以是:/api/data/,查询一条数据可以是:/api/data/123/,其中123表示要查询的数据ID。后端可以根据URL的结构来判断请求是查询列表还是查询一条数据,而不需要另外加一个type参数。

先抓包,找到特征再批量构造get请求