在django admin中,我们在页面顶部有搜索字段(对吗?)。 如果我以用户模型为例。和搜索领域在那里。
search_fields = ('name', 'phone', 'email', 'city')
我在GET api中获得了一个query_param。但我的程序不知道它是什么。它可以是phone_no或电子邮件或名称或其他任何东西。我必须在用户模型中搜索并过滤掉任何列中包含此数据的所有行。
所以我想编写一个django查询,但我不确定什么是最佳的优化方法。
现在写我使用Q
对象然后OR
操作。
例如Q(phone=param) | Q(email=param)
。
并且我想知道我是否必须为此编写SQL查询
答案 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模块,它使搜索变得简单快捷。