返回Django Queryset顶部的完全匹配

Cha*_*had 8 python django django-queryset

我有一个django模型,称为"用户",它存储一些关于人的基本信息,即名字和姓氏.我现在有在我的Django模型一个简单的搜索,其中,如果用户键入的第一个名字,查询集返回前10场比赛Django的,由有序的最后名称.

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

  1. Sam Abbott
  2. 塞缪尔贝克
  3. 萨米罗杰斯
  4. 山姆西蒙斯

这个代码很简单:

User.objects.filter(Q(first__istartswith=token)).order_by('last')
Run Code Online (Sandbox Code Playgroud)

但是,我想改变它,以便首先返回任何确切的名字匹配,然后是其余的结果.因此,如果有人输入"Sam",结果应该是:

  1. Sam Abbott
  2. 山姆西蒙斯
  3. 塞缪尔贝克
  4. 萨米罗杰斯

(确切的名字首先匹配,按姓氏排序,然后是按姓氏排序的其余匹配).

我想把它变成2个查询集然后只是组合列表,但我想知道是否有可能在1个查询中执行此操作,理想情况下坚持使用基本的django查询集API(而不是编写一次性查询).有谁知道这样做的方法?

提前致谢.

Eti*_*nne 7

我认为仅使用一个查询(至少使用 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)
Run Code Online (Sandbox Code Playgroud)

另一种方法是在 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
Run Code Online (Sandbox Code Playgroud)