Упорядочивание отфильтрованного набора запросов в соответствии с порядком списка

У меня есть список, описанный ниже. Мне нужен набор запросов, который будет упорядочен в соответствии со списком

список

 id_list = [3,1,2]

набор запросов

   queryset = Variant.objects.filter(pk__in=id_list)

набор запросов дает объекты в следующем порядке:

obj1
obj2
obj3

но я хочу объекты в соответствии с порядком в данном списке:

obj3
obj1
obj2

как??


person cjahangir    schedule 25.02.2016    source источник


Ответы (2)


Не определяйте порядок в коде - добавьте столбец порядка в свою таблицу и упорядочивайте по нему. Вот и все.

class Variant(models.Model):
    order = models.IntegerField()
    ...

Variant(ordering=3).save() # id == 1
Variant(ordering=1).save() # id == 2
Variant(ordering=2).save() # id == 3

queryset = Variant.objects.filter(pk__in=id_list).order_by('order')

Таким образом, у вас будет набор запросов в соответствии с желаемым порядком.

В противном случае google: конвертируйте список django в набор запросов и используйте ответ Sayse в качестве основы для своего кода. Один пример: django - преобразовать список обратно в набор запросов

person Yevgeniy Shchemelev    schedule 25.02.2016
comment
Спасибо за ваш ответ. Но мне это нужно для определенного случая. - person cjahangir; 25.02.2016
comment
Вы должны показать, как это применимо к вопросу оператора. Я почти уверен, что нет никакого способа упорядочить результаты запросов на основе массива python. - person Sayse; 25.02.2016
comment
Я обновил свой ответ. Но убедитесь, что если вы определяете порядок набора запросов по идентификатору объекта базы данных в коде - что-то не так с архитектурой. - person Yevgeniy Shchemelev; 25.02.2016

Я не думаю, что вы могли бы сделать это с помощью набора запросов (и я не понимаю, почему вы хотите...)

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

variants = list(map(lambda id: Variant.objects.get(pk=id), id_list))
person Sayse    schedule 25.02.2016
comment
эй Sayse, спасибо за ваш ответ. Я могу сделать то, что вы описали, но это дает мне список. Мне нужен набор запросов, так как позже мне понадобится дополнительный фильтр для этого набора запросов. - person cjahangir; 25.02.2016
comment
@cjahangir - нет смысла заказывать набор запросов, порядок их оценки не должен влиять на то, что вы пытаетесь сделать. - person Sayse; 25.02.2016