2011-09-09 30 views
14

düzeni korumak değil __in ben album_ids içinde kimliği yıllardan olarak bu sırayla sorgu kümesi albümleri ihtiyaç belirli bir düzenDjango: Sorgu arama querset

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

yılında kimlikleri var. Lütfen bana lütfen siparişi nasıl koruyabileceğimi söyleyin? veya albümleri albüm_id'lerinde olduğu gibi elde edersiniz? Kimliklerinin listesini varsayarsak

cevap

13

çok büyük değil, Python içinde bir listeye QS dönüştürmek ve sıralamak:

album_list = list(albums) 
album_list.sort(key=lambda album: album_ids.index(album.id)) 
+0

Geniş bir veritabanım var, ID'ler milyonlarca – Ahsan

+0

olabilir Sadece ileride başvurmak gerekirse, kimliklerin milyonlarca olabileceğini düşünüyorum çünkü çoğu uygulamada geçerli değiliz. Böyle bir miktarda bilgi yüklemesi gerekiyor. Bunun yerine, yalnızca görüntülenmesi ve daha iyi bir kullanıcı deneyimi için gerekli olan miktarı yükleyen django-pagination özelliğini kullanabilirsiniz. –

+1

Bu güzel bir çözümdür, ancak QuerySet'in üzerinde çalışmayı takip etmesini nasıl sağlar? –

9

Sen ORM aracılığı django bunu yapamaz. Ama kendinizi tarafından uygulamaya oldukça basit:

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] 
17

Djnago 1.8 beri bu şekilde yapabiliriz

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) 
+2

Bu sonuç harikadır çünkü sonuç, listeler oluşturan diğer yanıtların aksine bir sorgulamadır. –

+0

En iyi cevap! Teşekkürler Arun! – nextdoordoc

1

Sen extra QuerySet değiştirici

>>> 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']) 
kullanarak ORM aracılığı Django yapabiliriz