1、干嘛用的
用于编写视图时的接口参数检查
2、为什么需要它
避免接口发生意料之外的报错
它有什么优点
1、规范接口校验
2、减少冗余代码的产生
3、加速开发效率
4、简洁优雅
3、源代码
def verify(fields: list[str], obj, key_fields: list[str] = None, genres=None, is_in=True):
if key_fields:
if len(fields) < len(key_fields):
raise ValueError('需满足:fields长度 >= key_fields长度')
else:
key_fields = fields
def decide(value):
if is_in:
# 如果是软判定
return value or value is False
return True
_dict = {
key_fields[i] if i < len(key_fields) else field: value
for i, field in enumerate(fields) if decide(value := obj.get(field))
}
print('请求传入的数据', _dict)
return _dict
def in_verify(fields, obj, key_fields=None, is_dict=False):
"""
软判定
需满足:fields长度 >= key_fields长度
传入的数据value为 0、None、''、[]、{}、()时,该方法视为请求未传参(数据会被忽略)
"""
_dict = verify(fields, obj, key_fields)
return _dict if is_dict else Q(**_dict)
def get_verify(fields, obj, key_fields=None, is_q=False, to_dict=True):
"""
强制判定,有提示
传入的数据value为 0、None、''、[]、{}、false时,数据依然保留,不会被忽略
"""
if miss_field := set(fields) - set(obj.keys()):
return f'缺少{miss_field}参数'
if to_dict:
_dict = verify(fields, obj, key_fields, is_in=False)
return Q(**_dict) if is_q else _dict
4、实际使用
1、必传参数校验
2、非必传参数校验
3、 进阶使用
1、修改参数key值
2、校验模板类的所有参数
5、后话
使用本函数可能会耗损少量的时间复杂度。
只能适用于一部分的参数校验。
关于类型校验部分还未处理。
但是嘛,还是用的爽,能减少很多重复的代码,提升代码的可观性、可维护性。
另外函数适用于fastapi 与 django
主要区别只是获取model的field名称函数不一样
fastapt的是
django的是(这里_meta.fields是字段的对象列表)