我需要构建一个简单的用户名搜索。我希望它以用查询开头的用户名排序,然后在包含字符串的用户名之后排序。
如果我有一个像这样的用户名列表
我希望它这样订购:
如何在单个查询中实现此目的?现在我有
users = User.objects.filter(Q(name__istartswith='at') | Q(name__icontains='at'))
但是这会回来:
答案 0 :(得分:0)
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
ilike
是一个postgres扩展,对于mysql,您必须牺牲不区分大小写或为此编写相应的解决方法。
答案 1 :(得分:0)
" old"方式:
User.objects.filter(username__icontains='at')\
.extra(select={'q': "username ilike 'at%%%%'"},
order_by=['-q', 'username'])
此代码块过滤查询集并按OP的要求对其进行排序。
第二个答案中关于ilike
的说明也适用于此。