Django получает QuerySet из массива id в определенном порядке

это быстрый для вас:

У меня есть список id, который я хочу использовать для возврата QuerySet (или массив, если это необходимо), но я хочу сохранить этот порядок.

благодаря

Я не думаю, что вы можете применить этот конкретный порядок на уровне базы данных, поэтому вам нужно сделать это на 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] 

Это создает словарь объектов с их идентификатором как ключ, поэтому их можно легко получить при создании отсортированного списка.

Начиная с Django 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) 

Если вы хотите сделать это с помощью in_bulk, вам действительно необходимо объединить два ответа выше:

 id_list = [1, 5, 7] objects = Foo.objects.in_bulk(id_list) sorted_objects = [objects[id] for id in id_list] 

В противном случае результатом будет словарь, а не специально упорядоченный список.

Вот способ сделать это на уровне базы данных. Скопировать пасту с: blog.mathieu-leplatre.info :

MySQL :

 SELECT * FROM theme ORDER BY FIELD(`id`, 10, 2, 1); 

То же самое с 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; 

То же самое с 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',)) 
 id_list = [1, 5, 7] objects = Foo.objects.filter(id__in=id_list) sorted(objects, key=lambda i: id_list.index(i.pk)) 
  • Java: поиск наивысшего значения в массиве
  • Как получить динамический массив размера c ++
  • Arrays.fill с многомерным массивом в Java
  • Поиск массивов «не найден», даже если он найден
  • Каков правильный способ инициализации массива с фиксированной длиной?
  • Как удалить определенный элемент из JSONArray?
  • C, почему это объявление большого массива создает ошибку сегментации?
  • Как получить все подмножества массива?
  • Почему `Array (0,1,2) == Array (0,1,2)` не возвращает ожидаемый результат?
  • Получить объект JavaScript из массива объектов по значению свойства
  • Как найти размер int ?
  • Давайте будем гением компьютера.