python - 在 Django Queryset 顶部返回完全匹配

标签 python django django-queryset

我有一个名为“用户”的 Django 模型,它存储一些关于人的基本信息,即名字和姓氏。我目前在我的 django 模型中进行简单搜索,如果用户输入名字 名称,django 查询集会返回前 10 个匹配项,按姓氏 名称排序。

例如,目前,如果您搜索“Sam”,您可能会得到以下结果:

  1. 山姆·阿博特
  2. 塞缪尔·贝克
  3. 萨米·罗杰斯
  4. 山姆·西蒙斯

代码很简单:

User.objects.filter(Q(first__istartswith=token)).order_by('last')

但是,我想更改此设置,以便首先返回任何完全 名字匹配项,然后返回其余结果。因此,如果有人输入“Sam”,结果应该是:

  1. 山姆·阿博特
  2. 山姆·西蒙斯
  3. 塞缪尔·贝克
  4. 萨米·罗杰斯

(首先完全匹配名字,按姓氏排序,然后是其余匹配项按姓氏排序)。

我考虑过将其转换为 2 个查询集,然后仅组合列表,但我想知道是否可以在 1 个查询中执行此操作,理想情况下坚持使用基本的 django 查询集 API(而不是编写一次性查询).有谁知道这样做的方法吗?

提前致谢。

最佳答案

我认为只用一个查询真的不可能做到这一点(至少使用 Django ORM)。

所以您的 2 个查询应该如下所示:

limit = 10
q1 = User.objects.filter(first__iexact=token).order_by('last')[:limit]
limit -= len(q1)
if limit:
    q2 = User.objects.exclude(pk__in=q1).filter(first__istartswith=token).order_by('last')[:limit]
else:
    q2 = []
users = list(q1) + list(q2)

另一种方法是在 python 中过滤查询,但您必须获得所有结果,而不仅仅是最后 10 个:

query = User.objects.filter(first__istartswith=token).order_by('last')
exacts = [user for user in query if user.first == token]
others = [user for user in query if user.first != token]
users = exacts + others

关于python - 在 Django Queryset 顶部返回完全匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11406906/

相关文章:

python - 如何使用索引来访问Python中队列中的元素?

bwmorph 的 Python 等价物

python - django form.as_p 中的表单不同

python - 使用 HttpResponseRedirect 返回对象列表

python - 将原始 SQL 查询转换为 Django QuerySet

django - 修改查询集中每个对象的属性

python - 如何通过tensorflow实时检测两条线之间的角度

python - 如何在 Python 中读取间隔中的行?

python - django select_lated() 每次引用对象时都会调用数据库,而不是只调用一次

python - 如何将objects.all() 查找上的一对多关系传递给上下文作为可迭代