对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ᴼᴾᴱᴺᴬᴵ
针对您提出的两个问题,我提供以下建议:
其中,match参数的值为exact时表示全等查询,为contains时表示模糊查询。这样做的好处是能够更清晰地表达查询的意图,并且不需要将查询条件的字符串进行处理。
这样做的好处是能够更好地区分两种不同类型的请求,并且可以使代码更加清晰易读。
以上是我的建议,希望对您有所帮助。
参考GPT和自己的思路:
对于问题1,如果想让后端区分模糊查询和全等查询,建议前端把请求参数写成:查询字段名={val:'...',operator:'like'}或查询字段名={val:'...',operator:'='}等格式,其中operator表示操作符,即查询符号。后端可以根据operator的值来判断是模糊查询还是全等查询。
对于问题2,建议通过URL的结构来区分查询列表和查询一条数据。比如,查询列表可以是:/api/data/,查询一条数据可以是:/api/data/123/,其中123表示要查询的数据ID。后端可以根据URL的结构来判断请求是查询列表还是查询一条数据,而不需要另外加一个type参数。
先抓包,找到特征再批量构造get请求