2016-01-11 1 views
0

Мне нужно создать простой поиск имени пользователя. Я хочу, чтобы он упорядочивался по именам пользователей, которые начинаются с запроса, а затем после имен пользователей, содержащих строку.Django istartswith и содержит в том же запросе?

, если у меня есть список имен пользователей, как этот

  • джон
  • матовый
  • атома
  • atyler
  • mrmat

Хочу заказать вот так:

  • атом
  • atyler
  • матовый
  • mrmat

Как бы достичь этого в одном запросе? Сейчас у меня есть

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

Но это возвращает:

  • матовый
  • mrmat
  • atyler
  • атом
+2

Я не думаю, что вы могли бы заказать это. Только один заказ может быть применен к запросу. Вам нужен список для объединения двух запросов для сохранения порядка. –

+0

Есть ли способ добавить постоянное значение к результатам из istartwith и значков? Где константа будет одинаковой для всех istartswith, а другая константа содержит и сортирует по ней в конце? – Tyler

+0

Это, по сути, то, что я ищу http://stackoverflow.com/questions/7021097/need-to-annotate-django-queryset-based-on-which-q-object-was-found – Tyler

ответ

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 является ро stgres extension, для mysql вам придется либо жертвовать нечувствительностью к регистру, либо написать соответствующий обходной путь для этого.

0

«Старый» способ:

User.objects.filter(username__icontains='at')\ 
      .extra(select={'q': "username ilike 'at%%%%'"}, 
        order_by=['-q', 'username']) 

Этот блок кода фильтрует QuerySet и заказы оно в соответствии с требованиями ОП.

Также здесь применяется примечание о ilike от второго ответа.

+1

кодовые блоки сами по себе не очень полезны, вы должны хотя бы попытаться объяснить, как и почему это решает проблему op – Sayse

+0

@Saysee Если вы не понимаете блок кода, простое объяснение вряд ли сделает его более чистым для вас. –

Смежные вопросы