Django筛选任何匹配的列
在django admin中,我们在页面顶部有搜索字段(右侧?)。 如果我以用户模型为例。 并且搜索字段在那里。
search_fields = ('name', 'phone', 'email', 'city')
我在GET API中得到了一个query_param。 但我的程序不知道它是什么。 它可能是一个phone_no或电子邮件或名称或其他任何东西。 我必须在用户模型中进行搜索,并在任何列中过滤掉包含此数据的所有行。
所以我想写一个Django查询,但我不知道什么是最佳的优化方式来做到这一点。 现在写我使用Q
对象然后OR
操作。 例如Q(phone=param) | Q(email=param)
Q(phone=param) | Q(email=param)
。
并且Iwant知道我是否必须为此编写SQL查询
使用ORM,您可以做的不过是链式Q
对象。 您可以尝试编写自己的SQL查询,但有很多工作要做,而且您也无法完成最好的搜索。
如果你真的想要快速搜索,将处理大量的数据,你需要看看干草堆。 这是一个非常好的django模块,它使搜索变得简单快捷。
Q
对象绝对是对的。 你可以动态地做到这一点:
from django.db.models import Q
search_fields = ('name', 'phone', 'email', 'city')
q_objs = [Q(**{'%s' % i: param}) for i in search_fields]
queries = reduce(lambda x, y: x | y, q_objs)
results = Model.objects.filter(queries)
你甚至可以q_objs = [Q(**{'%s__icontains' % i: param}) for i in search_fields]
支持不完整搜索。