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]支持不完整搜索。

链接地址: http://www.djcxy.com/p/38707.html

上一篇: Django filter on any matching column

下一篇: .update(…) with an extra(…) and F(…)