Cha*_*had 8 python django django-queryset
我有一个django模型,称为"用户",它存储一些关于人的基本信息,即名字和姓氏.我现在有在我的Django模型一个简单的搜索,其中,如果用户键入的第一个名字,查询集返回前10场比赛Django的,由有序的最后名称.
例如,目前,如果您搜索"Sam",您可能会得到以下结果:
这个代码很简单:
User.objects.filter(Q(first__istartswith=token)).order_by('last')
Run Code Online (Sandbox Code Playgroud)
但是,我想改变它,以便首先返回任何确切的名字匹配,然后是其余的结果.因此,如果有人输入"Sam",结果应该是:
(确切的名字首先匹配,按姓氏排序,然后是按姓氏排序的其余匹配).
我想把它变成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)
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)
| 归档时间: |
|
| 查看次数: |
4086 次 |
| 最近记录: |