aquí hay uno rápido para ti:
Tengo una lista de identificaciones que quiero usar para devolver un QuerySet (o una matriz si es necesario), pero quiero mantener ese orden.
Gracias
No creo que pueda hacer cumplir ese orden en particular en el nivel de la base de datos, por lo que debe hacerlo en Python.
id_list = [1, 5, 7]
objects = Foo.objects.filter(id__in=id_list)
objects = dict([(obj.id, obj) for obj in objects])
sorted_objects = [objects[id] for id in id_list]
Esto crea un diccionario de los objetos con su ID como clave, por lo que se pueden recuperar fácilmente al crear la lista ordenada.
Desde Django 1.8, puede hacer:
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)
fuente
Case
When
están subestimados!distinct()
con order_by case when cláusula pero obtuve el error. cualquier apoyo, por favor.SELECT DISTINCT ON expressions must match initial ORDER BY expressions
- aquí está el mensaje de errorSi desea hacer esto usando in_bulk, en realidad debe combinar las dos respuestas anteriores:
id_list = [1, 5, 7] objects = Foo.objects.in_bulk(id_list) sorted_objects = [objects[id] for id in id_list]
De lo contrario, el resultado será un diccionario en lugar de una lista ordenada específicamente.
fuente
He aquí una forma de hacerlo a nivel de base de datos. Copiar y pegar de: blog.mathieu-leplatre.info :
MySQL :
SELECT * FROM theme ORDER BY FIELD(`id`, 10, 2, 1);
Lo mismo con Django:
pk_list = [10, 2, 1] ordering = 'FIELD(`id`, %s)' % ','.join(str(id) for id in pk_list) queryset = Theme.objects.filter(pk__in=[pk_list]).extra( select={'ordering': ordering}, order_by=('ordering',))
PostgreSQL :
SELECT * FROM theme ORDER BY CASE WHEN id=10 THEN 0 WHEN id=2 THEN 1 WHEN id=1 THEN 2 END;
Lo mismo con Django:
pk_list = [10, 2, 1] clauses = ' '.join(['WHEN id=%s THEN %s' % (pk, i) for i, pk in enumerate(pk_list)]) ordering = 'CASE %s END' % clauses queryset = Theme.objects.filter(pk__in=pk_list).extra( select={'ordering': ordering}, order_by=('ordering',))
fuente
id_list = [1, 5, 7] objects = Foo.objects.filter(id__in=id_list) sorted(objects, key=lambda i: id_list.index(i.pk))
fuente