Django istartswith和contains在同一查询中?
我需要建立一个简单的用户名搜索。我想让它按以查询开头的用户名排序,然后按包含字符串的用户名排序 如果我有一个这样的用户名列表Django istartswith和contains在同一查询中?,django,postgresql,Django,Postgresql,我需要建立一个简单的用户名搜索。我想让它按以查询开头的用户名排序,然后按包含字符串的用户名排序 如果我有一个这样的用户名列表 约翰 马特 原子 阿蒂勒 mrmat 我希望它的顺序如下: 原子 阿蒂勒 马特 mrmat 如何在单个查询中实现这一点?现在我有 users = User.objects.filter(Q(name__istartswith='at') | Q(name__icontains='at')) 但这也带来了: 马特 mrmat 阿蒂勒 原子 ilike是post
- 约翰
- 马特
- 原子
- 阿蒂勒
- mrmat
- 原子
- 阿蒂勒
- 马特
- mrmat
users = User.objects.filter(Q(name__istartswith='at') | Q(name__icontains='at'))
但这也带来了:
- 马特
- mrmat
- 阿蒂勒
- 原子
ilike
是postgres的一个扩展,对于mysql,您要么牺牲大小写不敏感,要么为此编写相应的解决方法。旧方法:
此代码块过滤查询集,并根据OP的要求对其排序
第二个答案中关于“我喜欢”的注释也适用于这里。我认为你不能这样点餐。只能对queryset应用一个排序。您需要一个列表来连接2个查询集以保持顺序。是否有方法将常量值添加到istartwith和icontains的结果中?其中常数对于所有istartswith都是相同的,并且在最后包含一个不同的常数并按其排序?这基本上就是我所寻找的代码块本身并不是很有用,你至少应该试着解释这是如何或为什么解决op的问题的issue@Saysee如果你不理解一个代码块,那么简单的解释很难让它更清晰。
class Z(Func):
function = 'ilike'
template = "%(expressions)s %(function)s 'in%%%%'"
for u in User.objects.filter(username__icontains('in'))\
.annotate(q=Z(F('username')))\
.order_by('-q', 'username'):
print u.username, u.q
User.objects.filter(username__icontains='at')\
.extra(select={'q': "username ilike 'at%%%%'"},
order_by=['-q', 'username'])