Django istartswith并包含在相同的查询中?

时间:2016-01-11 21:36:32

标签: django postgresql

我需要构建一个简单的用户名搜索。我希望它以用查询开头的用户名排序,然后在包含字符串的用户名之后排序。

如果我有一个像这样的用户名列表

  • john
  • matt
  • atom
  • atyler
  • mrmat

我希望它这样订购:

  • 原子
  • atyler
  • 亚光
  • mrmat

如何在单个查询中实现此目的?现在我有

users = User.objects.filter(Q(name__istartswith='at') | Q(name__icontains='at'))

但是这会回来:

  • matt
  • mrmat
  • atyler
  • 原子

2 个答案:

答案 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的说明也适用于此。