Django过滤任何匹配的列

时间:2015-11-24 15:19:57

标签: sql django django-models django-queryset

在django admin中,我们在页面顶部有搜索字段(对吗?)。 如果我以用户模型为例。和搜索领域在那里。

search_fields = ('name', 'phone', 'email', 'city')

我在GET api中获得了一个query_param。但我的程序不知道它是什么。它可以是phone_no或电子邮件或名称或其他任何东西。我必须在用户模型中搜索并过滤掉任何列中包含此数据的所有行。

所以我想编写一个django查询,但我不确定什么是最佳的优化方法。 现在写我使用Q对象然后OR操作。 例如Q(phone=param) | Q(email=param)

并且我想知道我是否必须为此编写SQL查询

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

使用ORM,您只能做Q个链{{1}}个对象。您可以尝试编写自己的SQL查询,但还有很多工作要做,您也无法完成最佳搜索。

如果您真的想快速搜索以处理大量数据,则需要查看haystack。这是一个非常好的django模块,它使搜索变得简单快捷。