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'])