django: поиск в запросе не поддерживает порядок в querset - PullRequest
23 голосов
/ 09 сентября 2011

У меня есть идентификаторы в определенном порядке

>>> album_ids = [24, 15, 25, 19, 11, 26, 27, 28]
>>> albums = Album.objects.filter( id__in=album_ids, published= True )
>>> [album.id for album in albums]
[25, 24, 27, 28, 26, 11, 15, 19]

Мне нужны альбомы в запросе в том же порядке, что и идентификаторы в album_ids. Кто-нибудь, пожалуйста, скажите мне, как я могу поддерживать порядок? или получить альбомы как в album_ids?

Ответы [ 4 ]

36 голосов
/ 15 июля 2016

Начиная с Djnago 1.8 вы можете делать таким образом

from django.db.models import Case, When

pk_list = [10, 2, 1]
preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(pk_list)])
queryset = MyModel.objects.filter(pk__in=pk_list).order_by(preserved)
16 голосов
/ 09 сентября 2011

Если список идентификаторов не слишком велик, вы можете преобразовать QS в список и отсортировать его в Python:

album_list = list(albums)
album_list.sort(key=lambda album: album_ids.index(album.id))
9 голосов
/ 09 сентября 2011

Вы не можете сделать это в Django через ORM.Но это довольно просто реализовать самостоятельно:

album_ids = [24, 15, 25, 19, 11, 26, 27, 28]
albums = Album.objects.filter(published=True).in_bulk(album_ids) # this gives us a dict by ID
sorted_albums = [albums[id] for id in albums_ids if id in albums]
1 голос
/ 06 февраля 2018

Вы можете сделать это в Django через ORM, используя extra QuerySet модификатор

>>> album_ids = [24, 15, 25, 19, 11, 26, 27, 28]
>>> albums = Album.objects.filter( id__in=album_ids, published= True
             ).extra(select={'manual': 'FIELD(id,%s)' % ','.join(map(str, album_ids))},
                     order_by=['manual'])
...