
在 Django 的 View 视图中需要实现id_student和name_student的模糊搜索允许前端使用相同的search_keyword参数进行查询。然而由于id_student可能是整型字段而 Django ORM 不支持在非字符串字段上直接使用__icontains进行模糊匹配因此需要找到合适的方式同时支持这两个字段的搜索。解决方案在 Django ORM 查询时id_student作为整数字段无法直接使用icontains进行模糊匹配因此需要使用Cast函数将其转换为字符串字段从而支持icontains搜索。通过Q对象可以组合多个查询条件实现name_student和id_student的并行搜索。此外为了保证数据查询的有效性查询时还需要排除已被标记为删除的数据is_deleted0。fromdjango.db.modelsimportQ,CharFieldfromdjango.db.models.functionsimportCast# 假设 search_keyword 是从请求参数获取的搜索关键字search_keywordsome_search_keyword# 使用 Q 对象构造查询允许对 name_student 和 id_student 进行模糊匹配studentsAoYuStudent.objects.annotate(str_id_studentCast(id_student,output_fieldCharField())).filter(Q(name_student__icontainssearch_keyword)|Q(str_id_student__icontainssearch_keyword),is_deleted0).values(id_student,name_student)在查询逻辑中Cast(id_student, output_fieldCharField())允许将id_student作为字符串处理使其可以使用icontains进行模糊匹配。而Q(name_student__icontainssearch_keyword) | Q(str_id_student__icontainssearch_keyword)通过|操作符实现OR查询确保search_keyword能够匹配name_student或id_student。最终使用values()仅返回所需的id_student和name_student字段。假设数据库中有以下数据id_studentname_student1001张三1002李四2101王五3102赵六当search_keyword10时查询结果可能如下[{id_student:1001,name_student:张三},{id_student:1002,name_student:李四}]当search_keyword王时查询结果如下[{id_student:2101,name_student:王五}]该方法通过Cast进行类型转换并结合Q对象实现灵活的模糊搜索支持id_student和name_student的同时查询。适用于 Django ORM在搜索较大数据集时可能会有一定的性能损耗可以结合索引优化查询效率。