【发布时间】:2018-09-30 12:33:45
【问题描述】:
我正在实现搜索功能,其中包含通过匹配多个表和这些表中的多个字段来查找记录的选项。
假设我想通过他/她的名字或姓氏找到Customer,或者通过存储在与Customer 不同的模型中的Order 的ID。
我已经实现的简单场景是用户只在搜索字段中键入单个单词,然后我使用 Django Q 使用直接字段引用或 related_query_name 引用来查询 Order 模型,例如:
result = Order.objects.filter(
Q(customer__first_name__icontains=user_input)
|Q(customer__last_name__icontains=user_input)
|Q(order_id__icontains=user_input)
).distinct()
小菜一碟,一点问题都没有。
但是如果用户想要缩小搜索范围并在搜索字段中输入多个单词怎么办。
示例:用户输入了Bruce,并通过搜索返回了大量记录。
现在他/她想要更具体,并将客户的姓氏添加到搜索中。因此搜索变为 Bruce Wayne,在将其拆分为单独的部分后,我得到了 Bruce 和 Wayne。显然我不想搜索Orders 模型,因为order_id 是一个单字实例,一次找到客户就足够了,所以在这种情况下,我完全将其从查询中删除。
现在我正在尝试通过名字和姓氏来匹配客户,我还想处理提供数据的顺序是随机的情况,以正确处理 Bruce Wayne 和 Wayne Bruce,这意味着我仍然有客户全名,但名字和姓氏的位置不固定。
这就是我正在寻找答案的问题:如何构建查询来搜索模型的多个字段,而不知道哪个搜索词属于哪个表。
我猜这个解决方案很简单,而且肯定有一种优雅的方法可以创建这样一个动态查询,但我想不出方法。
【问题讨论】:
标签: django django-queryset django-q